Gen*_*ene 11 java functional-programming java-8 method-reference
给出了一些Java 8方法函数:
class Foo { Bar getBar() {} }
class Bar { Baz getBaz() {} }
Run Code Online (Sandbox Code Playgroud)
两个访问器的组合看起来像:
Function<Foo, Bar> getBarFromFoo = Foo::getBar;
Function<Bar, Baz> getBazFromBar = Bar::getBaz;
Function<Foo, Baz> getBazFromFoo = getBarFromFoo.andThen(getBazFromBar);
Run Code Online (Sandbox Code Playgroud)
有更简洁的方法吗?这似乎有效
((Function<Foo, Bar>) Foo::getBar).andThen(Bar::getBaz)
Run Code Online (Sandbox Code Playgroud)
但它相当难看.由于优先原因,外围有意义,但为什么演员必要?
(Foo::getBar::getBaz会很好,但唉...)
And*_*lko 10
让我们定义一个功能界面:
@FunctionalInterface
interface MyFunctionalInterface {
Bar getBar(Foo f);
}
Run Code Online (Sandbox Code Playgroud)
我们可以简化一下方法参考Foo::getBar,
(Foo foo) -> foo.getBar();
Run Code Online (Sandbox Code Playgroud)
这意味着"采取Foo并返回Bar".对于这样的描述,很多方法是合适的(例如,我们的接口与getBar和Funtion<Foo, Bar>其apply):
MyFunctionalInterface f1 = (Foo foo) -> foo.getBar();
Function<Foo, Bar> f2 = (Foo foo) -> foo.getBar();
Run Code Online (Sandbox Code Playgroud)
这就是为什么演员必要的问题的答案.
为了回答肯定是否有更简洁的方式的问题,我们必须设定一个背景.上下文明确地告诉我们Function继续合作:
class Functions {
public static <I, O> Function<I, O> of(Function<I, O> function) {
return function;
}
}
Functions.of(Foo::getBar).andThen(Bar::getBaz);
Run Code Online (Sandbox Code Playgroud)
除了andThen().
您需要执行强制转换,因为Foo::getBar它不明确。**它可以匹配具有相似方法签名的每个接口。
不幸的是,((Function<Foo, Bar>) Foo::getBar).andThen(Bar::getBaz)这是你能做的最好的事情。