在 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() 没有括号?

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

它说 "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> 即:

  • 取一对Strings1, s2
  • 呼叫 l1 = s1.lengthl2 = s2.length
  • returns l1.compareTo(l2)

那么,为什么没有括号呢?

因为你正在传递一个方法reference。此方法将在 稍后 在尚未定义的实例上调用。请注意,length 不是 String 上的 static,因此 String.length() 无法编译。