在 java 中,对 Comparator.comparing() 使用 String::length
in java, use String::length for Comparator.comparing()
我有这样一段代码:
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() 没有括号?
它说 "Accepts a function that extracts a Comparable sort key from a type T, and returns a Comparator that compares by that sort key."
如何String::length匹配这个类型?
谢谢。
String::length
是一个 method reference。使用它相当于
Comparator.comparing(s -> s.length())
因此它通过比较字符串的长度来比较字符串。
TL;DR:您正在通过 method reference
Java 8 将 lambda 语法引入 Java 语言,这只是其中的一小部分,它允许您将 方法 作为拉姆达.
所以你调用方法 Comparator.comparing
,这需要一个 "key extractor" 函数,它从 Collection<T>
和 returns 中获取一个对象 [=12] =].
方法 String.length
returns 一个 Integer
(装箱时)和一个 Integer
与另一个 Integer
相当。所以调用 Comparator.comparing(String::length)
returns a Comparator<String>
即:
- 取一对
String
、s1, s2
- 呼叫
l1 = s1.length
和 l2 = s2.length
- returns
l1.compareTo(l2)
那么,为什么没有括号呢?
因为你正在传递一个方法reference。此方法将在 稍后 在尚未定义的实例上调用。请注意,length
不是 String
上的 static
,因此 String.length()
无法编译。
我有这样一段代码:
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() 没有括号?
它说 "Accepts a function that extracts a Comparable sort key from a type T, and returns a Comparator that compares by that sort key."
如何String::length匹配这个类型?
谢谢。
String::length
是一个 method reference。使用它相当于
Comparator.comparing(s -> s.length())
因此它通过比较字符串的长度来比较字符串。
TL;DR:您正在通过 method reference
Java 8 将 lambda 语法引入 Java 语言,这只是其中的一小部分,它允许您将 方法 作为拉姆达.
所以你调用方法 Comparator.comparing
,这需要一个 "key extractor" 函数,它从 Collection<T>
和 returns 中获取一个对象 [=12] =].
方法 String.length
returns 一个 Integer
(装箱时)和一个 Integer
与另一个 Integer
相当。所以调用 Comparator.comparing(String::length)
returns a Comparator<String>
即:
- 取一对
String
、s1, s2
- 呼叫
l1 = s1.length
和l2 = s2.length
- returns
l1.compareTo(l2)
那么,为什么没有括号呢?
因为你正在传递一个方法reference。此方法将在 稍后 在尚未定义的实例上调用。请注意,length
不是 String
上的 static
,因此 String.length()
无法编译。