我是靠谱客的博主 粗暴煎饼,最近开发中收集的这篇文章主要介绍Lambda在Comparator中的应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 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中的应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部