1. ホーム
  2. java

Collectors.toList()はどのようなList<E>を返すのですか?

2023-08-18 06:36:21

質問

私が読んでいるのは ラムダの現状。ライブラリ編 を読んでいて、ある記述に驚いています。

セクションの下にある ストリーム の下に、以下のようにあります。

List<Shape> blue = shapes.stream()
                         .filter(s -> s.getColor() == BLUE)
                         .collect(Collectors.toList());

このドキュメントには、どのような shapes が実際に何であるかは書かれておらず、それが重要であるかどうかさえわかりません。

私が困惑するのは、次のようなことです。どのような具体的な List を返すのでしょうか?

  • これは、変数を List<Shape> に割り当てていますが、これは全く問題ありません。
  • stream() また filter() はどのようなリストを使うかを決めます。
  • Collectors.toList() の具体的な型はどちらも指定しない。 List .

では、何 具体的 の型(サブクラス)は List はここで使われているのでしょうか?保証はあるのでしょうか?

どのように解決するのですか?

<ブロッククオート

では、ここで使われているListの具象型(サブクラス)は何でしょうか?保証はあるのでしょうか?

のドキュメントを見ると Collectors#toList() のドキュメントを見ると、次のように書かれています。 "返されるリストの型、ミュータビリティ、シリアライザビリティ、スレッドセーフは保証されません。 . もし、特定の実装を返したい場合は Collectors#toCollection(Supplier) を使うことができます。

Supplier<List<Shape>> supplier = () -> new LinkedList<Shape>();

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(supplier));

そして、このラムダからは List<Shape> .

更新 :

あるいは、メソッド参照を使うこともできます。

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(LinkedList::new));