在java中,使用String :: length进行Comparator.comparing()

时间:2015-04-20 16:37:38

标签: java java-8 comparator

我有一个像这样的代码:

String[] yetToSortedArray = {"Abc","hello world","nihao?","chilemaNin"};
Arrays.parallelSort(yetToSortedArray, Comparator.comparing(String::length));
for(String str : yetToSortedArray){
    System.out.println(str + ", ");
}

我的问题在这里:“String :: length” 我真正传递给Comparator.comparing()的是什么? 为什么String :: length()没有括号?

我想我正在使用这个:https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-java.util.Comparator-

它表示“接受一个从类型T中提取Comparable排序键的函数,并返回一个按该排序键进行比较的Comparator。”

dos String :: length如何匹配此类型?

感谢。

2 个答案:

答案 0 :(得分:8)

String::lengthmethod reference。使用它相当于

Comparator.comparing(s -> s.length())

因此它通过比较字符串的长度来比较字符串。

答案 1 :(得分:4)

TL; DR:您正在传递method reference

Java 8将lambda语法引入Java语言,这只是其中的一小部分,它允许您将方法作为 lambda 传递。

所以你调用方法Comparator.comparing,这需要一个&#34;密钥提取器&#34;从Collection<T>获取对象并返回类型为U extends Comparable<? super U>的对象的函数。

方法String.length返回Integer(装箱时),Integer与另一个Integer相当。因此,调用Comparator.comparing(String::length)会返回Comparator<String>

  • 选择一对Strings1, s2
  • 致电l1 = s1.lengthl2 = s2.length
  • 返回l1.compareTo(l2)

那么,为什么没有括号?

因为您正在传递方法引用。此方法将在尚未定义的实例上称为以后。请注意,length上的static不是String,因此String.length()无法编译。