Java 从已经存在的函数接口实现(比如通过匿名类)创建方法引用有什么意义? 接口Foo{ T应用(T double 1,T double 2); } 公开课考试{ 静态空隙计算(双精度1,双精度2,Foo func){ 双重结果=功能应用(双重1,双重2); 系统输出打印项次(结果); } 公共静态void main(字符串[]args){ 双双1=100; 双双2=0.2; 计算(double1,double2,new Foo(){ 公共双联申请(双联1、双联2){ 返回double1*(1+double2); } }::申请); //^^^^^^^----它有什么改进吗?(没有它代码就可以工作) } }
我不理解在匿名类的构造结束时语法Java 从已经存在的函数接口实现(比如通过匿名类)创建方法引用有什么意义? 接口Foo{ T应用(T double 1,T double 2); } 公开课考试{ 静态空隙计算(双精度1,双精度2,Foo func){ 双重结果=功能应用(双重1,双重2); 系统输出打印项次(结果); } 公共静态void main(字符串[]args){ 双双1=100; 双双2=0.2; 计算(double1,double2,new Foo(){ 公共双联申请(双联1、双联2){ 返回double1*(1+double2); } }::申请); //^^^^^^^----它有什么改进吗?(没有它代码就可以工作) } },java,anonymous,functional-interface,Java,Anonymous,Functional Interface,我不理解在匿名类的构造结束时语法::apply的用法。我不明白为什么这不会导致编译错误,我也不明白它实现了什么 如果删除::apply,程序将正常工作。那么为什么在这个例子中使用双冒号呢?这确实是:操作符的一个糟糕用法。显式地构造一个匿名Foo实例只是为了转身使用::apply来提取apply()实现并创建第二个匿名函数对象,这是非常愚蠢的。它同时使用两个等价的成语。一个就行了 正如您所说,更明智的做法是关闭::apply,直接使用匿名对象: interface Foo<T> {
::apply
的用法。我不明白为什么这不会导致编译错误,我也不明白它实现了什么
如果删除
::apply
,程序将正常工作。那么为什么在这个例子中使用双冒号呢?这确实是:
操作符的一个糟糕用法。显式地构造一个匿名Foo
实例只是为了转身使用::apply
来提取apply()
实现并创建第二个匿名函数对象,这是非常愚蠢的。它同时使用两个等价的成语。一个就行了
正如您所说,更明智的做法是关闭::apply
,直接使用匿名对象:
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)
}
}
后者将是我的首选,因为它更简洁。谢谢@Pshemo。然而,这解释了双冒号的用法,我理解,但我不理解为什么它被添加到匿名类的末尾,而不需要在那里。如果你删除::应用程序仍然有效,那么为什么要把它放在第一位。在这种情况下,我建议使用选项来澄清你的问题。否则,我担心有些人会简单地将其标记为我在第一条评论中提供的问题的副本(这将阻止新的答案发布在这里)。谢谢。非常好的解释-代码来自一个著名的源代码,所以我真的很困惑。
calculate(double1, double2, new Foo<Double>() {
public Double apply(Double double1, Double double2) {
return double1 * (1+double2);
}
});
calculate(double1, double2, (a, b) -> a * (1 + b));