Java 8:リストをストリームAPIとマージする


80

私は次の状況にあります

Map<Key, ListContainer> map; 

public class ListContainer{
  List<AClass> lst;
}

私はすべてのリストをマージする必要があるlstからListContainerからオブジェクトMapマップ。

public static void main(String args[]){
   List<AClass> alltheObjectsAClass = map.values().stream(). // continue....    
}

Java 8ストリームAPIを使用して、どのようにアイデアがありますか?


マージの意味の例を教えてください。マップが{a: [1,2], b[3,4]}、のようにチェーン化する[1,2,3,4]か、リストのリストを作成[[1,2],[3,4]]する[[1,3],[2,4]]か、または圧縮するかを指定しますか?また、地図には順序がないことをご存知ですか?
tobias_k 2014

@tobias_k結果を並べ替えないでほしい[1,2,3,4]
mat_boy 2014

場合ListContainerのみ、ラップList<T>、あなたは置き換えることができMap<Key, ListContainer>Map<Key, List<T>>
ThePyroEagle

回答:


169

flatMap()はあなたが探しているものだと思います。

例えば:

 List<AClass> allTheObjects = map.values()
         .stream()
         .flatMap(listContainer -> listContainer.lst.stream())
         .collect(Collectors.toList());

2
.flatMap(Collection::stream)ここで不可能な理由を説明するコメントが削除されたのはなぜ ですか?
Puce 2016年

良い質問@Puce、しかし、それは一種-のことが可能です:場合はListContainer、カプセル化された(すなわちのgetterを持っているlst)、あなたは分解することができる.flatMap(->).map(ListContainer::getLst) .flatMap(Collection::stream)
TWiStErRob

3
@TWiStErRobはい、それは私が元のコメントに書いたものです。なぜ削除されたのですか?
ピュース2016年

@あなたの答えに、なぜ.flatMap(Collection::stream)不可能なのかを説明するメモを入れたほうがいいと思います。より永続的である必要があります。
SQB 2018

1
@Alexはい、これは一方向の応答です。.map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
ピュース


2

Java 8では、ストリームList1.stream()。collect(Collectors.toList())。addAll(List2);を使用できます。別のオプションList1.addAll(List2)


1

すでに上で答えましたが、ここにあなたが取ることができる別のアプローチがあります。私がこれを適応させた元の投稿を見つけることができませんが、あなたの質問のためにここにコードがあります。上記のように、flatMap()関数は、Java 8で利用しようとしているものです。これをユーティリティクラスにスローして、「RandomUtils.combine(list1、list2、...);」を呼び出すだけです。そして、すべての値を含む単一のリストを取得します。ワイルドカードには注意してください。一般的でないメソッドが必要な場合は、これを変更できます。セット用に変更することもできます。セットでflatMap()を使用する場合は、セットインターフェイスの性質によるequals / hashCodeメソッドによるデータ損失を回避するように注意する必要があります。

  /**
    * Combines multiple lists into a single list containing all elements of
    * every list.
    * 
    * @param <T> - The type of the lists.
    * @param lists - The group of List implementations to combine
    * @return a single List<?> containing all elements of the passed in lists.
    */
   public static <T> List<?> combine(final List<?>... lists) {
      return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList());
   }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.