java—从已经存在的函数接口实现(比如通过匿名类)创建方法引用有什么意义?

oxalkeyp  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(297)
interface Foo<T> {
    T apply(T double1, T double2);
}

public class Test {
    static void calculate(Double double1, Double double2, Foo<Double> func) {
        double result = func.apply(double1, double2);
        System.out.println(result);
    }

    public static void main(String[] args) {
        double double1 = 100;
        double double2 = 0.2;
        calculate(double1, double2, new Foo<Double>() {

            public Double apply(Double double1, Double double2) {
                return double1 * (1+double2);
            }
        }::apply);
       //^^^^^^^---- does it improve anything? (code will work without it)
    }
}

我不懂语法的用法 ::apply 在匿名类构造的最后。我不明白为什么这不会导致编译错误,我也不明白它实现了什么。
如果你移除 ::apply ,程序运行正常。那么为什么在这个例子中使用双冒号呢?

mctunoxg

mctunoxg1#

这的确是一个拙劣的用法 :: 接线员。显式构造匿名 Foo<Double> 示例只是为了转身使用 ::apply 提取 apply() 实现并创建第二个匿名函数对象。它同时使用两个等价的成语。一个就行了。
正如你所说的,不谈更明智 ::apply 直接使用匿名对象:

calculate(double1, double2, new Foo<Double>() {
    public Double apply(Double double1, Double double2) {
        return double1 * (1+double2);
    }
});

或者抛弃匿名者 Foo<Double> 类并使用100%lambda语法:

calculate(double1, double2, (a, b) -> a * (1 + b));

我更喜欢后者,因为它要简洁得多。

相关问题