web-dev-qa-db-ja.com

コレクションのストリームを1つのコレクションに結合-Java 8

したがって、別のストリームで一連の変換を行うことで取得する_Stream<Collection<Long>>_があります。

私がする必要があるのは、_Stream<Collection<Long>>_を1つの_Collection<Long>_に収集することです。

これらをすべて次のようなリストにまとめることができます。

_<Stream<Collection<Long>> streamOfCollections = /* get the stream */;

List<Collection<Long>> listOfCollections = streamOfCollections.collect(Collectors.toList());
_

そして、そのコレクションのリストを反復処理して、それらを1つにまとめることができました。

ただし、.map()または.collect()を使用して、コレクションのストリームを1つの_Collection<Long>_に結合する簡単な方法が必要だと思います。どうすればいいのか考えられません。何か案は?

30
Andrew Mairose

この機能は、ストリームで flatMapメソッド を呼び出すことで実現できます。これは、Functionアイテムを、収集可能な別のStreamアイテムにマップするStreamを受け取ります。

ここで、flatMapメソッドはStream<Collection<Long>>Stream<Long>に変換し、collectはそれらをCollection<Long>に収集します。

Collection<Long> longs = streamOfCollections
    .flatMap( coll -> coll.stream())
    .collect(Collectors.toList());
55
rgettman

collect を使用し、サプライヤ(ArrayList::new部分)を提供することでこれを行うことができます。

Collection<Long> longs = streamOfCollections.collect(
    ArrayList::new, 
    ArrayList::addAll,
    ArrayList::addAll
);
12
Vivin Paliath

不要な場合はクラスを指定する必要はありません。より良い解決策は次のとおりです。

Collection<Long> longs = streamOfCollections.collect(
    ArrayList::new,
    Collection::addAll,
    Collection::addAll
);

ArrayListは必要ないが、HashSetは必要だとしましょう。そして、1行だけ編集する必要もあります。

0
Helmut Provost