概述
- Java8中Comparator的接口源码如下,这其中包括了@FunctionalInterface注解、defult关键字和(para1, para2) -> {statement}语法。
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
default Comparator<T> thenComparing(Comparator<? super T> other) {
Objects.requireNonNull(other);
return (Comparator<T> & Serializable) (c1, c2) -> {
int res = compare(c1, c2);
return (res != 0) ? res : other.compare(c1, c2);
};
}
//后面省略
}
- 在Map中有一个Entry的接口,其中有一个方法是:
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getKey().compareTo(c2.getKey());
}
基于上面两段代码对Lambda进行一个简单的介绍:
第二段代码等同于:
// 新建一个类,实现Comparator的接口
class ComparatorLambda<K extends Comparable<? super K>,V>
implements Comparator<Map.Entry<K,V>>, Serializable {
//(Comparator<Map.Entry<K, V>> & Serializable) 等同于继承了两个接口,&在这里不是位运算
@Override
public int compare(Map.Entry<K, V> c1, Map.Entry<K, V> c2) {
return c1.getKey().compareTo(c2.getKey());
}
}
......
// 使用新建的类,并实例化且作为返回值返回
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
return new ComparatorLambda<K, V>();
}
- @FunctionalInterface注解
新注解,用来标注这是一个“方法接口”,即一个接口中只有一个方法去实现
- default关键字
在一个被@FunctionalInterface标注的接口中,可以用这个关键字来区分“方法接口”想要在lambda表达式中起作用的方法和不会起作用的方法
比如在这句代码中
(Comparator<Map.Entry<K, V>> & Serializable)(c1, c2) -> c1.getKey().compareTo(c2.getKey())
由于Comparator中只有int compare(T o1, T o2);这一个Functional Interface,所以lambda就对号入座地把(c1, c2) -> c1.getKey().compareTo(c2.getKey())认定为是int compare(T o1, T o2);的方法实现。
Tips:
泛型K是Comparable的子类,所以c1,c2可以用compareTo这个方法去比较,比如,当K是String的时候是吧。
Comparator中的equals方法和Object中的重复了,所以不算是一个Functional Interface,而且编译器也不会这么认为的,自己可以去试一下。
最后声明一下,这个写得有点乱,初学者就凑合着看吧,我也只是做个笔记。
最后
以上就是粗暴煎饼为你收集整理的Lambda在Comparator中的应用的全部内容,希望文章能够帮你解决Lambda在Comparator中的应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复