组成 Java 函数和消费者
Composing a Java Function and Consumer
在功能上组合 java Function
和 Consumer
的最佳方法是什么?
例如,给定一些 Function<Object, String> f
和一些 Consumer<String> c
然后做 f.andThen(c)
会感觉很自然,但这不是接口的工作方式。
我看到的两个选项是将 Consumer<String> c
替换为 Function<String, Void> c
或将 Consumer<String> c
更改为 BiConsumer<Function<Object, String>, String> c
并执行
accept(Function<Object, String> f, Object o) {
String thing = f.apply(o);
//do something with thing
}
其中一个比另一个好吗?有没有更好的方法?
这是你想要做的吗?
Consumer<Object> composed = o -> c.accept(f.apply(o));
如果你发现自己经常遇到这个问题,你可以创建一个静态方法来做到这一点(但是真的值得吗?):
static<T,R> Consumer<T> applyAndAccept(Function<? super T,? extends R> f, Consumer<R> c){
return t -> c.accept(f.apply(t));
}
这不是用map
和forEach
完成的吗?
public void test() {
Function<Object, String> f = (Object t) -> t.toString();
Consumer<String> c = (String t) -> {
System.out.println(t);
};
List<Object> data = new ArrayList<>();
data.stream().map(f).forEach(c);
}
您可以在自己的代码中复制 java.util.function.Function 界面。将其命名为 ConsumableFunction 并将所有默认方法参数类型和 return 值从 Function 更改为 ConsumableFunction。然后添加如下默认函数:
default Consumer<T> atLast(Consumer<R> consumer) {
Objects.requireNonNull(consumer);
return (T t) -> consumer.accept(apply(t));
}
现在让所有函数实现改为实现 ConsumableFunction。然后你可以这样写代码:
Consumer<A> consumerForA = functionFromAToB
.andThen(functionFromBToC)
.andThen(functionFromCToD)
.atLast(consumerForD);
在功能上组合 java Function
和 Consumer
的最佳方法是什么?
例如,给定一些 Function<Object, String> f
和一些 Consumer<String> c
然后做 f.andThen(c)
会感觉很自然,但这不是接口的工作方式。
我看到的两个选项是将 Consumer<String> c
替换为 Function<String, Void> c
或将 Consumer<String> c
更改为 BiConsumer<Function<Object, String>, String> c
并执行
accept(Function<Object, String> f, Object o) {
String thing = f.apply(o);
//do something with thing
}
其中一个比另一个好吗?有没有更好的方法?
这是你想要做的吗?
Consumer<Object> composed = o -> c.accept(f.apply(o));
如果你发现自己经常遇到这个问题,你可以创建一个静态方法来做到这一点(但是真的值得吗?):
static<T,R> Consumer<T> applyAndAccept(Function<? super T,? extends R> f, Consumer<R> c){
return t -> c.accept(f.apply(t));
}
这不是用map
和forEach
完成的吗?
public void test() {
Function<Object, String> f = (Object t) -> t.toString();
Consumer<String> c = (String t) -> {
System.out.println(t);
};
List<Object> data = new ArrayList<>();
data.stream().map(f).forEach(c);
}
您可以在自己的代码中复制 java.util.function.Function 界面。将其命名为 ConsumableFunction 并将所有默认方法参数类型和 return 值从 Function 更改为 ConsumableFunction。然后添加如下默认函数:
default Consumer<T> atLast(Consumer<R> consumer) {
Objects.requireNonNull(consumer);
return (T t) -> consumer.accept(apply(t));
}
现在让所有函数实现改为实现 ConsumableFunction。然后你可以这样写代码:
Consumer<A> consumerForA = functionFromAToB
.andThen(functionFromBToC)
.andThen(functionFromCToD)
.atLast(consumerForD);