Java,为什么 collections.sort() 仍然适用于非比较器类型的参数?

标签 java lambda collections

我知道在java Collections类中,有一个静态方法sort:

sort(List<T> list, Comparator<? super T> c**)

sort 中的第二个参数应该是一个实现Comparator 接口(interface)的对象及其比较方法。

但是当我学习lambda的方法引用时,我看到了这个例子:

public class Test 
{
     public static void main(String[] args) 
    {
        new Test().sortWord();  
    }

    public void sortWord()
    {
        List<String> lst = new ArrayList<>();
        lst.add("hello");
        lst.add("world");
        lst.add("apple");
        lst.add("zipcode");

        Collections.sort(lst, this::compareWord);

        System.out.println(lst);
    }

    public int compareWord(String a, String b)
    {
       return a.compareTo(b);
    }

这是实例方法的方法引用示例。 compareWord 方法与 Comparator 接口(interface)无关,我不明白为什么会这样?谁能解释一下?

非常感谢。

最佳答案

int compareWord(String a, String b)int compare(String o1, String o2) 具有相同的签名Comparator<String> 的方法界面。因此它可以用作该接口(interface)的实现。

这是一种较短的写法:

Collections.sort(lst, new Comparator<String> () {
                     public int compare (String o1, String o2) {
                         return compareWord(o1,o2);
                     }
                 });

在 Java 8 中,任何函数式接口(interface),例如 Comparator (即具有单个抽象方法的接口(interface))可以使用具有与该接口(interface)的抽象方法的签名相匹配的签名的方法的方法引用来实现。

关于Java,为什么 collections.sort() 仍然适用于非比较器类型的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45779160/

相关文章:

java - QuickBlox Android 无响应

java - 动态壁纸强制接近场景

vb.net - 我如何在 VB.net 中编写这个 lambda 选择方法?

java - 如何在没有显式转换的情况下对返回泛型类型的方法使用 lambdaJ 的 extract()

java - 任何与保留所有功能相反的方法?

java - 将一个值放入 Java 中的映射中*而不*更新现有值(如果存在)

java - 参数化 h :commandButton

Java解析oracle时间戳为date.util.date

c# - 为 select 中的表达式提取 lambda 片段

java - 如何从 StackFrameStream 中只获取前两个 stackFrames?