我知道在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/