给定一些 Java 8 方法函数:
class Foo { Bar getBar() {} }
class Bar { Baz getBaz() {} }
两个访问器的组合如下所示:
Function<Foo, Bar> getBarFromFoo = Foo::getBar;
Function<Bar, Baz> getBazFromBar = Bar::getBaz;
Function<Foo, Baz> getBazFromFoo = getBarFromFoo.andThen(getBazFromBar);
有没有更简洁的方法?这似乎有效
((Function<Foo, Bar>) Foo::getBar).andThen(Bar::getBaz)
但它相当丑陋。出于优先原因,外部括号是有意义的,但为什么需要强制转换?
(Foo::getBar::getBaz
会很好,但唉...)
最佳答案
让我们定义一个函数式接口(interface):
@FunctionalInterface
interface MyFunctionalInterface {
Bar getBar(Foo f);
}
我们可以引用简化方法Foo::getBar
一点点,
(Foo foo) -> foo.getBar();
这意味着 “获取一个 Foo
并返回一个 Bar
”。对于该描述,很多方法都是合适的(例如,我们与 getBar
和 Funtion<Foo, Bar>
及其 apply
的接口(interface)):
MyFunctionalInterface f1 = (Foo foo) -> foo.getBar();
Function<Foo, Bar> f2 = (Foo foo) -> foo.getBar();
这就是为什么需要强制转换这个问题的答案。
要肯定地回答是否有更简洁的方式,我们必须设置一个上下文。上下文明确地给了我们一个 Function
继续与:
class Functions {
public static <I, O> Function<I, O> of(Function<I, O> function) {
return function;
}
}
Functions.of(Foo::getBar).andThen(Bar::getBaz);
关于java - 编写 Java 方法引用的简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45760337/