2016-12-20 12 views
0

ことで、私は次のモデルがあります:Javaの8つのストリーム - グループの親プロパティ

public class Employee { 
    Set<Position> positions; 
} 

public class Position { 
    Area area; 
} 

をして、私のコントローラで、私はList<Employee>を持っていると私はラムダストリーム操作でエリアを知るMap<Area, List<Employee>>その結果を取得したいです従業員のあらゆる地位の

どうすればこの問題を解決できますか?

+3

、彼が複数の領域をも持つことができるようです。従業員を最終的な地図の複数の領域に表示したいですか? – JDC

+0

複数の領域に表示される場合は問題ありません。しかし、それをフィルタリングできれば、それは素晴らしいでしょう –

+1

も参照してくださいhttp://stackoverflow.com/questions/36960226/java-stream-groupingby-by-a-nested-list-list-in-a-second-orderおよびhttp://stackoverflow.com/questions/34999568/java-8-convert-mapinteger-liststring-to-mapstring-listinteger-with – Tunaki

答えて

1

EmployeeAreaの間のフラットな関連付けを取得する必要があります。これにより、groupingByでマップに集めることができます。ここで

はそれを行うための一つの方法だ:あなたの従業員が複数のポジションを持つことができるという事実によって

Map<Area, List<Employeee>> map = 
    empList.stream() 
      .flatMap (e-> e.positions 
          .stream() // a Stream<Position> for a single Employee 
          .map(p->Collections.singletonMap(e,p.area) 
              .entrySet() 
              .iterator() 
              .next())) 
          .collect (Collectors.groupingBy(Map.Entry::getValue, 
                  Collectors.mapping (Map.Entry::getKey, 
                       Collectors.toList()))); 
+0

私のIDEでコードを修正した後でも、次のエラーが 'Collectors.groupingBy( ) '' Map.Entry :: getKey': '非静的メソッドは静的コンテキストから参照できません' – JDC