从已经退出的功能接口实现创建方法引用有什么意义(比如通过匿名 class)?
What is the point of creating method reference from already exiting implementation of functional interface (like via anonymous class)?
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)
}
}
我不明白在匿名 class 的构造结束时语法 ::apply
的用法。我不明白为什么这不会导致编译错误,我也不明白它实现了什么。
如果删除 ::apply
,该程序将运行。那么为什么在这种情况下使用双冒号呢?
这确实是对 ::
运算符的错误使用。显式构造一个匿名 Foo<Double>
实例只是为了转身并使用 ::apply
提取 apply()
实现并创建一个 second 匿名函数是相当愚蠢的目的。它同时使用了两个等价的成语。一个就可以了。
正如您所说,放弃 ::apply
并直接使用匿名对象会更明智:
calculate(double1, double2, new Foo<Double>() {
public Double apply(Double double1, Double double2) {
return double1 * (1+double2);
}
});
或者放弃匿名 Foo<Double>
class 并使用 100% lambda 语法:
calculate(double1, double2, (a, b) -> a * (1 + b));
我更喜欢后者,因为它更简洁。
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)
}
}
我不明白在匿名 class 的构造结束时语法 ::apply
的用法。我不明白为什么这不会导致编译错误,我也不明白它实现了什么。
如果删除 ::apply
,该程序将运行。那么为什么在这种情况下使用双冒号呢?
这确实是对 ::
运算符的错误使用。显式构造一个匿名 Foo<Double>
实例只是为了转身并使用 ::apply
提取 apply()
实现并创建一个 second 匿名函数是相当愚蠢的目的。它同时使用了两个等价的成语。一个就可以了。
正如您所说,放弃 ::apply
并直接使用匿名对象会更明智:
calculate(double1, double2, new Foo<Double>() {
public Double apply(Double double1, Double double2) {
return double1 * (1+double2);
}
});
或者放弃匿名 Foo<Double>
class 并使用 100% lambda 语法:
calculate(double1, double2, (a, b) -> a * (1 + b));
我更喜欢后者,因为它更简洁。