我有一个像这样的代码:
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()没有括号?
它表示“接受一个从类型T中提取Comparable排序键的函数,并返回一个按该排序键进行比较的Comparator。”
dos String :: length如何匹配此类型?
感谢。
答案 0 :(得分:8)
答案 1 :(得分:4)
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>
:
String
,s1, s2
l1 = s1.length
和l2 = s2.length
l1.compareTo(l2)
那么,为什么没有括号?
因为您正在传递方法引用。此方法将在尚未定义的实例上称为以后。请注意,length
上的static
不是String
,因此String.length()
无法编译。