1. ホーム
  2. java

[解決済み] Java 8 で java.util.stream.Stream からリストを取得する

2022-03-22 15:42:50

質問

私は、コレクションを簡単にフィルタリングするためにJava 8のラムダを使いまわしていました。しかし、私は同じ文の中で新しいリストとして結果を取得する簡潔な方法を見つけられませんでした。以下は、これまでのところ、私の最も簡潔なアプローチです。

List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<>();
sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add);

ネット上の例では、新しい結果リストを生成することなく停止してしまうので、私の質問には答えてくれませんでした。もっと簡潔な方法があるはずです。私が期待したのは Stream クラスには toList() , toSet() , ...

変数 targetLongList は、3行目で直接代入できるのでしょうか?

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

あなたのやっていることは、ストリームがシーケンシャルである限り、最もシンプルな方法でしょう。 forEach .

[後日談: sequential()の呼び出しが必要な理由は、そのままのコード( forEach(targetLongList::add) ) ストリームが並列であれば、キビキビとした動きになります。その場合でも、意図した効果は得られません。 forEach は明示的に非決定的であり、シーケンシャルストリームであっても要素の処理順序は保証されない。そのため forEachOrdered を使用することで、正しい順序を確保することができます。Stream API の設計者の意図は、以下のように、このような状況でコレクターを使うことです] 。

別の方法として

targetLongList = sourceLongList.stream()
    .filter(l -> l > 100)
    .collect(Collectors.toList());