Kurpiakで:
いくつかのいずれかは、複雑なの次亜種の違いを説明できComparator
秒?
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
二つでもコンパイルすることはできませんが、OKですか?
彼らは次のとおりでした:
コンパイラは、知っているComparator.comparingInt(String::length)
リターンComparator<String>
(あなたが渡しているので、ToIntFunction<String>
それに)、したがって、第二を期待するComparator
に渡されたが、thenComparing
であるようにComparator<String>
、それはのタイプを推測することができますので、Comparator
で返さComparator.naturalOrder()
なければとComparator<String>
。
最初のとき一方、Comparator
によって返されるComparator.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);