对于下面的代码:
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)的,以及返回语句是如何工作的吗?
发布于 2016-06-23 22:22:59
方法comparing()不比较事物。
它返回新的比较器,它被描述为lamda。这是可能的,因为比较器接口是FunctionalInterface。
所以,这段代码
(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));
}
}所以c1和c2是参数的名称。
通过keyExtractor函数提取关键字,对项目进行比对。
实际对象从实际使用比较器的位置传递到compare()方法中。通常,这些是不同的排序方法,其中所有集合值都通过循环或迭代器进行迭代,并将它们彼此比较到某个外部值。例如,您可以检查Arrays.mergeSort。
https://stackoverflow.com/questions/37993804
复制相似问题