Java8 lambda 将 List 转换为 Map of Maps

标签 java lambda java-8 java-stream

是否可以转换List<Entry>Map<Employee, Map<LocalDate, Entry>>用一个 lambda 表达式?

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>) 

谢谢

最佳答案

假设 Entry 有 getter 并且 Employee 覆盖了 hashCode()equals():

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

请注意,如果员工有重复的日期,这将引发异常。

关于Java8 lambda 将 List 转换为 Map of Maps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41708545/

相关文章:

java - AsyncTask 未按预期完成

c++ - 在 C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?

java 8 - Icomparable<T> 的注释 compareTo <T> 也添加了注释 compareTo(Object o)

JavaFX为ProgressIndicator和Spinner设置不同的样式

java - GWT - 如何生成 *.nocache.js

java - 有一个 if 语句,其中多个测试使用相同的输出完成

java - 自定义 JScrollPane。在 ScrollBar 行上添加一个组件

java - 通用类型的流图

python - 做 "[[' a', 2], ['b' ,1]] + [ ['b' , 2], ['c' , 1]] = [ ['b' , 3], ['a' , 2], 0x1045,67910"的任何 pythonic 方式?

java - 使用流修改 map