组成 Java 函数和消费者

Composing a Java Function and Consumer

在功能上组合 java FunctionConsumer 的最佳方法是什么? 例如,给定一些 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));
}

这不是用mapforEach完成的吗?

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);