2017-11-19 9 views
3

私はリストを持っており、リストは2つの異なるオブジェクトプロパティでグループ化され、値は第3のプロパティを使用する必要があります。例:Java 8ストリームでマップされた値を持つリストのネストされたグループ化方法

Map<String,Map<String,List<A>>> grouppedRecords = list.stream().collect(groupingBy(A::getA, groupingBy(A::getB))); 

    Map<String,Map<String,List<String>>> results = grouppedRecords.entrySet().stream().collect(Collectors.toMap(
      Map.Entry::getKey, 
      e12 -> e12.getValue().entrySet().stream().collect(Collectors.toMap(
        Map.Entry::getKey, 
        e22 -> e22.getValue().stream().map(A::getC).collect(Collectors.toList()) 
      ))) 
    ); 

しかし、それは過剰に複雑になります。

[A("1","2","3"),A("1","2","4"),A("1","3","4"),A("2","3","5")] 

は、私は次のような構成を使用し、この結果を得るために、今すぐ

{1={2=[3, 4], 3=[4]}, 2={3=[5]}} 

に変換する必要があります。あなたは同じ問題を慰めるためのより良い方法で私を助けてくれますか?

あなたが getC()Aインスタンスをマップするために Collectors.mappingを使用することができます
+0

あなたの説明によると、あなたはむしろしたくない '{(1、2)= [3、4]、(1、 3)= [4]、(2、3)= [5]} '? –

+0

いいえ、ネストされたマッピングを意味します –

答えて

3

Map<String,Map<String,List<String>>> results = 
    list.stream() 
     .collect(groupingBy(A::getA, 
          groupingBy(A::getB, 
             mapping(A::getC, toList())))); 
+0

ありがとうございます。それが私が探しているものです。 –

+0

@OlgaGorunようこそ – Eran

関連する問題