对Comparator lambda表达式的理解

uml comparator comparable

I

Integer[] arr = {1,2,3,4,5,6,7,8,9};
Arrays.sort(arr,Integer::compareTo);

为什么 编译不报错

Comparator 函数式接口不是需要实现 int compare(T o1, T o2);
这个抽象方法吗?
Integer::compareTo他的签名是int compareTo(Integer anotherInteger) 和上述方法没有形成重写呢??

你提到的点非常准确,但在这里有一个关键的概念需要澄清:Java 的函数式接口和方法引用。
首先,Comparator 确实是一个函数式接口,它定义了一个抽象方法 int compare(T o1, T o2)。但是,当你使用 Integer::compareTo 作为方法引用时,Java 的编译器会进行一些“魔法”来确保类型安全和方法签名匹配。
在 Integer::compareTo 的情况下,这个方法引用实际上被转换成了一个实现了 Comparator 接口的匿名内部类的实例,其中 compare 方法被实现为调用 Integer 对象的 compareTo 方法。这里的关键是理解 Java 的方法引用是如何工作的。
当你写 Integer::compareTo 时,你并没有直接实现 Comparator 接口的 compare 方法。相反,你提供了一个指向现有方法的引用,该方法与 compare 方法在逻辑上等效(尽管它的签名在 Integer 类中是以 compareTo 命名的)。Java 编译器能够理解这种等价性,并生成相应的匿名内部类来实现 Comparator。
这个匿名内部类可能看起来像这样(尽管这不是实际的代码,只是为了说明概念):

Comparator<Integer> comparator = new Comparator<Integer>() {  
    @Override  
    public int compare(Integer o1, Integer o2) {  
        return o1.compareTo(o2);  
    }  
};

在这个匿名内部类中,compare 方法调用了 Integer 对象的 compareTo 方法,从而实现了所需的比较逻辑。
因此,尽管 Integer::compareTo 和 Comparator 的 compare 方法在字面上不是同一个方法,但 Java 的方法引用机制允许它们以类型安全的方式协同工作,实现相同的功能。这种机制是 Java 8 引入的 lambda 表达式和方法引用的核心优势之一,它使得代码更加简洁和易于理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值