java-8 - Comparator.comparing() 函数如何工作?

标签 java-8 compare comparator comparable compareto

对于下面的代码:

ForComparatorDemo object1 = new ForComparatorDemo("object-1",5);
ForComparatorDemo object2 = new ForComparatorDemo("object-2",4);
ForComparatorDemo object3 = new ForComparatorDemo("object-3",3);
ForComparatorDemo object4 = new ForComparatorDemo("object-4",4);

List<ForComparatorDemo> objectList = new ArrayList<>();
objectList.add(object1);
objectList.add(object2);
objectList.add(object3);
objectList.add(object4);
Comparator<ForComparatorDemo> comparer = Comparator.comparing(ForComparatorDemo::getAge);
objectList.sort(comparer);
objectList.forEach(object -> System.out.println(object.getName() + " " + object.getAge()));

我得到了这个输出(这是正确的):

对象 3 3

对象 2 4

对象 4 4

对象 1 5

问题是该比较功能实际上是如何工作的?
在深入研究文档后,我找到了 Coamparator.comparing(..) 函数的代码:
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
        Function<? super T, ? extends U> keyExtractor)
{
    Objects.requireNonNull(keyExtractor);
    return (Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

你能解释一下这个函数是如何获得这两个值(c1 和 c2)的,以及 return 语句是如何工作的吗?

最佳答案

方法comparing()不比较事物。

它返回新的比较器,它被描述为 lamda。这是可能的,因为比较器接口(interface)是功能接口(interface)。

所以,这段代码

(Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));

相当于:
new Comparator<T>() {
    int compare(T c1, T c2) {
        return keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    } 
}

所以c1c2是参数的名称。

项目按key进行比较,由keyExtractor提取功能。

实际对象被传递到 compare()方法来自实际使用比较器的地方。通常,这些是不同的排序方法,其中所有集合值都通过循环或迭代器进行迭代,并在某个外部值上相互比较。例如,您可以检查 Arrays.mergeSort .

关于java-8 - Comparator.comparing() 函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37993804/

相关文章:

java - 从 java 8 切换到 java 11

lambda - 使用 lambda 在 java8 中具有双重条件的 Foreach 循环

java - 我被困在 Java 中的第一个 hackerrank 挑战中

java - java 8 中要映射的对象数组列表

c - 如何比较两个字符串并返回相同单词的数量?

c++ - 对 STL 集使用比较器

java - 比较器如何工作?

python - 寻找解决方案来检查图像大小是否符合我在 python 中的要求

java - 如何在java中比较两个日期和时间

java - 在 Java 中将比较器与对象列表一起使用