collect(Collectors.toList()) と Stream.toList() の違いが見つかりました。見る
class Animal { }
class Cat extends Animal { }
record House(Cat cat) { }
class Stuff {
public static void function() {
List<House> houses = new ArrayList<>();
List<Animal> animals1 =
houses.stream()
.map(House::cat)
.collect(Collectors.toList()); // ok
List<Animal> animals2 =
houses.stream()
.map(House::cat).toList(); // compile error
List<Animal> animals3 =
houses.stream()
.map(House::cat)
.map(cat -> (Animal) cat).toList(); // ok
}
}
collect(Collectors.toList()) は、動物のリストまたは猫のリストを取得できます。しかし、Stream.toList() は Cat のリストしか提供できません。
問題は、Stream.toList() を機能させる方法があるかどうかです。私の実際の例では、Runnable のリストを返す shutdownNow をオーバーライドするクラスがあるため、私のクラスは something.stream().collect(Collectors.toList()) を呼び出していましたが、something.stream().toList() MyRunnable のリストを返します。
default <U super T> List<U> toList()
私の一部は、彼らが関数を の代わりにとして宣言したことを望んでいdefault List<T> toList()
ますが、奇妙なことに、それは私のマシンでのコンパイル エラーです (私のコンパイラは、U extends T ではなく、U super T で問題ないようです)。