我有以下示例:
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/