gpt4 book ai didi

java - java 8中的复杂比较器

转载 作者:行者123 更新时间:2023-12-04 00:03:56 25 4
gpt4 key购买 nike

谁能解释复杂Comparators的以下变体之间的区别?

List<String> listOfStrings = Arrays.asList("algo", "test", "is", "a", "common");

listOfStrings.stream()
.sorted(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()))
.sorted(Comparator.naturalOrder().thenComparing(Comparator.comparingInt(String::length))
.forEach(System.out::println);

为什么第一次调用 sorted 是可以的,而第二次甚至不能编译?

最佳答案

编译器知道 Comparator.comparingInt(String::length)返回 Comparator<String> (因为您将 ToIntFunction<String> 传递给它),因此期望第二个 Comparator , 传递给 thenComparing , 成为 Comparator<String> ,因此它可以推断出 Comparator 的类型由 Comparator.naturalOrder() 返回成为 Comparator<String> .

另一方面,当第一个 ComparatorComparator.naturalOrder() 返回(返回 Comparator<T> ),编译器不知道 Comparator 的类型期待 thenComparing 的论点,所以它拒绝 Comparator<String>传递给它。

如果您声明 Comparator 的类型,则可以避免此错误。由 Comparator.naturalOrder() 返回明确:

Comparator<String> comp = Comparator.naturalOrder();
listOfStrings.stream()
.sorted(comp.thenComparing(Comparator.comparingInt(String::length)))
.forEach(System.out::println);

关于java - java 8中的复杂比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52715163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com