Mau*_*ice 8 java lambda anonymous-inner-class comparator java-8
在" OCP学习指南 "一书中,有一个关于可以用两种方式初始化的比较器的示例.第一个是通过这样的匿名类:
Comparator<Duck> byWeight = new Comparator<Duck>(){
public int compare(Duck d1, Duck d2){
return d1.getWeight() - d2.getWeight();
}
};
Run Code Online (Sandbox Code Playgroud)
这个我能理解.根据这本书,这可以用这样的lambda表达式替换:
Comparator<Duck> byWeight = (d1,d2) -> d1.getWeight() - d2.getWeight();
Run Code Online (Sandbox Code Playgroud)
现在这个我不明白.lambda表达式不返回Comparator对象,由于Comparator是一个接口,因此我现在无法想到它.
那么new第一个例子中的运算符是否引用了正在创建的匿名类,它被称为Comparator,因为匿名类实现了Comparator接口?
那么在例2中到底发生了什么?是否以lambda表达式创建了某个对象?在这个例子中,你byWeight用作参考变量吧?
我真的不明白这一点,有人可以解释一下吗?谢谢.
Wil*_*sem 12
如果您阅读了界面文档Comparator,可以阅读:
功能接口: 这是一个功能接口,因此可以用作lambda表达式或方法引用的赋值目标.
因此,Comparator<T>接口实现如下:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
// ...
}Run Code Online (Sandbox Code Playgroud)
现在,如果我们看一下@FunctionalInterface我们看到的文档:
一种信息性注释类型,用于指示接口类型声明旨在成为 Java语言规范定义的功能接口.从概念上讲,功能界面只有一种抽象方法.由于默认方法具有实现,因此它们不是抽象的.如果接口声明覆盖其中一个公共方法的抽象方法
java.lang.Object,那么也不会计入接口的抽象方法计数,因为接口的任何实现都将具有来自java.lang.Object其他地方的实现.
所以基本上如果你有一个抽象方法的接口,并且你将接口注释为a @FunctionalInterface,那么该接口是函数的目标:你或多或少构造一个实现功能接口的匿名类,你指定的函数是唯一抽象方法的实现.
换句话说,表达式:
Comparator<Duck> byWeight = <somelambda>
Run Code Online (Sandbox Code Playgroud)
是等价于:
Comparator<Duck> byWeight = new Comparator<Duck>(){
public int compare(Duck d1, Duck d2){
return <somelambda>(d1,d2);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2208 次 |
| 最近记录: |