Java 8 Comparator.comparating()函数是如何工作的?

Java 8 Comparator.comparating()函数是如何工作的?,java-8,compare,comparator,comparable,compareto,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 ForComparatorDe

有关以下代码:

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()));
ForComparatorDemo object1=新的ForComparatorDemo(“object-1”,5);
ForComparatorDemo object2=新的ForComparatorDemo(“object-2”,4);
ForComparatorDemo object3=新的ForComparatorDemo(“object-3”,3);
ForComparatorDemo object4=新的ForComparatorDemo(“object-4”,4);
List objectList=new ArrayList();
objectList.add(object1);
objectList.add(object2);
objectList.add(object3);
objectList.add(object4);
Comparator comparer=Comparator.comparing(ForComparatorDemo::getAge);
objectList.sort(comparer);
objectList.forEach(object->System.out.println(object.getName()+“”+object.getAge());
我得到了这个输出(这是正确的):

对象3 3

对象2 4

对象4

对象1 5

问题是这个比较函数实际上是如何工作的? 在深入研究文档之后,我找到了这个用于CoComparator的代码。比较(..)函数:

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));
}
publicstatic方法
comparing()
不比较事物

它返回新的比较器,称为lamda。这是可能的,因为比较器接口是功能接口

所以,这个代码

(Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
(比较器&可序列化)
(c1,c2)->keyExtractor.apply(c1).与(keyExtractor.apply(c2))进行比较;
相当于:

new Comparator<T>() {
    int compare(T c1, T c2) {
        return keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    } 
}
新比较器(){
整数比较(T c1,T c2){
返回keyExtractor.apply(c1)。与(keyExtractor.apply(c2))进行比较;
} 
}
因此,
c1
c2
是参数的名称

项目按键进行比较,键由
keyExtractor
函数提取


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

我实际上要查找的是这个函数如何获取参数c1和c2,答案来自列表界面,我在深入研究文档后发现了这个界面。我添加了关于比较器用法的部分。