2017-01-17 19 views
4

List<Entry>Map<Employee, Map<LocalDate, Entry>>に1つのラムダ式で変換できますか?Java8ラムダ変換マップの一覧へ

public class Entry { 
    Employee employee; 
    LocalDate date; 
} 

は、これまでのところ、私はこのような何かを思い付いています

entries.stream().collect(Collectors.toMap(Collectors.groupingBy(Entry::getEmployee), Collectors.groupingBy(Entry::getDate), Function.identity())); 

しかし、これはコンパイルエラーを与える:

no suitable method found for 
toMap(java.util.stream.Collector<com.a.Entry,capture#1 of ?,java.util.Map<com.a.Employee, 
java.util.List<com.a.Entry>>>‌​,java.util.stream.Co‌​llector<com.a.Entry,‌​capture#2 of ?, 
java.util.Map<java.time.LocalDate,java.util.List<com.a.Ent‌ry>>>, 
java.util.func‌​tion.Function<java.l‌​ang.Object,java.lang‌​.Object>) 

おかげ

+0

Employeeはマップの適切なキーですか? BTWは、 "動作しない"と定義します。 – aventurin

+0

コンパイルエラー: toMap(java.util.stream.Collector )の適切なメソッドが見つかりません>>、java.util.stream.Collector >>、java.util.function。 Function ) – przem

答えて

10

Entryはゲッターがあり、Employeeと仮定すると、 hashCode()とを上書きします。:

Map<Employee, Map<LocalDate, Entry>> result = entries.stream() 
     .collect(Collectors.groupingBy(Entry::getEmployee, 
       Collectors.toMap(Entry::getDate, Function.identity()))); 

従業員に重複した日付がある場合、例外が発生することに注意してください。

+0

wicketは、完全に動作します。重複の例外は予想される動作です。ありがとうございました – przem

+0

そして、もし私が 'Map >'を必要とするのなら、そのマップのキーはEmployee :: getUsernameです ?キーを操作することは可能ですか? – przem

+1

@przemもちろん、 'entry - > entry.getEmployee()。​​getUsername()'で 'Entry :: getEmployee'を置き換えてください。 – shmosel

関連する問題