java - 编写 Java 方法引用的简洁方法?

标签 java functional-programming java-8 method-reference

给定一些 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。对于该描述,很多方法都是合适的(例如,我们与 getBarFuntion<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/

相关文章:

java - java如何支持java枚举常量的实例变量?

java - 在websphere分布式事务中使用teradata数据源

list - 是否有比我所做的更像 OCaml 的方式来将元组列表转换为列表?

java - Eclipse:Java 构建路径重置中的 JRE 系统库

java - Java 11 和 Java 8 DecimalFormat 行为之间的差异

java - Mono.error 内的日志输出两次

java - 为什么我的 POST 方法没有被调用?包括代码

generics - 有没有办法确定 Lua 函数的签名?

exception - Haskell 中的安全应用

Java使用流计算最大客户价格