编写Java函数和使用者

kag*_*ag0 8 java functional-programming function-composition java-8

功能组成java Function和a 的最佳方法是Consumer什么?例如,给定一些Function<Object, String> f和一些Consumer<String> c然后做的f.andThen(c)感觉自然,然而这不是接口的工作方式.

这两个选项我看到的是要么更换Consumer<String> cFunction<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
}
Run Code Online (Sandbox Code Playgroud)

其中一个比另一个好吗?有没有更好的办法?

Mis*_*sha 10

这是你想要做的吗?

Consumer<Object> composed = o -> c.accept(f.apply(o));
Run Code Online (Sandbox Code Playgroud)

如果你发现自己经常遇到这个问题,你可以用静态的方法来做这个(但这真的值得吗?):

static<T,R> Consumer<T> applyAndAccept(Function<? super T,? extends R> f, Consumer<R> c){
    return t -> c.accept(f.apply(t));
}
Run Code Online (Sandbox Code Playgroud)

  • 有时值得:你可以使用两个很酷的方法引用而不是单个无聊的lambda.如果你的方法引用是实例绑定的,而实例存储在非final变量中,那么lambda版本可能看起来很笨拙.在这种情况下,您提出的静态方法甚至比不存在的默认方法`andThen(Consumer)`更好,因为方法引用类型将被自动推断. (2认同)