java - 父亲使用 Java 8 解释排序和静态方法

标签 java sorting java-8

我有以下示例:

public class Utils{
   public static int compareByLength(String s1, String s2)
  {
    return s1.length() - s2.length();
   }
}


Arrays.sort(srt,Utils::compareByLength);

我了解了Java8中的引用方法,也了解了这里的排序条件。

我不明白的是 Sort 的底层是如何工作的。它接受静态方法:“compareByLength”,并知道如何将字符串 s1、s2 转换为比较器变量。

我知道 Array.sort 将第二个参数设置为: Comparator<? super T> c

但我仍然很难理解它如何使用函数compareByLength并真正“理解”比较器标准。

谢谢, 射线。

最佳答案

Arrays.sort方法代码看起来像

public static <T> void sort(T[] a, Comparator<? super T> c) {
    if (c == null)
        c = NaturalOrder.INSTANCE;
    if (LegacyMergeSort.userRequested)
        legacyMergeSort(a, c);
    else
        TimSort.sort(a, 0, a.length, c, null, 0, 0);
}

因此,基于参数,它使用排序算法,例如在本例中将合并排序或蒂姆排序传递给您想要排序的数组和比较器,该比较器应用于决定如何对元素进行排序(以防比较器不会被传递)将使用默认值 NaturalOrder.INSTANCE)。

Comparator是函数式接口(interface),因为它只有一个抽象方法

int compare(T o1, T o2);

我们可以使用方法引用Utils::compareByLength这与使用 lambda 相同
(String s1, String s2) -> Utils.compareByLength(s1,s2)所以它几乎与传递扩展 Comparator<String> 的匿名内部类的实例相同接口(interface)并实现其 compare使用 lambda 体的方法。所以你的代码类似于

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return Utils.compareByLength(s1, s2);
    }
});

现在总契约(Contract)是Comparator#compare(value1, value2)返回

  • 0 表示相等的值,
  • 负值如果第一个元素小于第二个元素,这意味着按升序它们位于正确的位置
  • 如果第一个元素大于第二个元素,则正值值,这意味着它们没有排序(使用升序)。

此标准用于排序算法的实现,因此无论是否使用合并排序、快速排序tim排序契约(Contract)都保持不变相同的。现在,每个排序算法都可以使用 sort 中传递的比较器方法,在您的情况下是 Comparator ,这要归功于 Lambdas 或更准确地说方法引用正在使用 Utils.compareByLength方法来决定两个元素是否应该切换。

关于java - 父亲使用 Java 8 解释排序和静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24231464/

相关文章:

java - 无法解析 Java 流中的方法 Character::hashCode

java - Ant:如何安装编译的程序(FOP 1.0)

c# - 从 ListView 排序中排除项目

linux - 如何根据 K 列的长度对 Tab 格式文件进行排序

Javascript:围绕特定数字对整数数组进行排序

java - 将 unicode 字符转换为包含其 u+[hexa] 表示形式 ("\u2030"的字符串)

java-8 - 在代码中硬编码公钥而不是从 public.der 中挑选它

java - 为什么反射返回两种方法,而只有一种实现?

java - JFrame 相互重叠

java - 通过声明初始化变量