Javaで複雑なコンパレータ8

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);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=224991&siteId=1