首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Comparator.comparing()函数是如何工作的?

Comparator.comparing()函数是如何工作的?
EN

Stack Overflow用户
提问于 2016-06-23 21:58:39
回答 1查看 2.4K关注 0票数 5

对于下面的代码:

代码语言:javascript
复制
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(..)的代码。功能:

代码语言:javascript
复制
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)的,以及返回语句是如何工作的吗?

EN

回答 1

Stack Overflow用户

发布于 2016-06-23 22:22:59

方法comparing()不比较事物。

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

所以,这段代码

代码语言:javascript
复制
(Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));

等同于:

代码语言:javascript
复制
new Comparator<T>() {
    int compare(T c1, T c2) {
        return keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    } 
}

所以c1c2是参数的名称。

通过keyExtractor函数提取关键字,对项目进行比对。

实际对象从实际使用比较器的位置传递到compare()方法中。通常,这些是不同的排序方法,其中所有集合值都通过循环或迭代器进行迭代,并将它们彼此比较到某个外部值。例如,您可以检查Arrays.mergeSort

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37993804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档