私はコレクションを簡単にフィルタリングするために 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行目で変数を直接割り当てる方法はありますか?
ベストアンサー1
ストリームが連続的であれば、これが最も簡単な方法かもしれません。そうでない場合は、 の前に sequential() を呼び出す必要がありますforEach
。
sequential() の呼び出しが必要な理由は、現状のコード ( forEach(targetLongList::add)
) は、ストリームが並列の場合に競合が発生するためです。それでも、forEach
明示的に非決定的であるため、意図した効果は得られません。つまり、シーケンシャル ストリームであっても、要素の処理順序は保証されません。正しい順序を保証するには、 を使用する必要があります。Stream forEachOrdered
API 設計者の意図は、この状況では以下のように collector を使用することです。
targetLongList = sourceLongList.stream()
.filter(l -> l > 100)
.collect(Collectors.toList());