【问题标题】:Java8 lambda convert List to Map of MapsJava8 lambda将列表转换为地图地图
【发布时间】:2017-01-17 22:58:25
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您确定 Employee 是适合地图的键吗?顺便说一句,定义“不起作用”。
  • 编译错误:找不到适合 toMap(java.util.stream.Collector>>,java.util.stream.Collector>>,java.util.function.Function)

标签: java lambda java-8 java-stream


【解决方案1】:

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

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

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

【讨论】:

  • 检票口,完美运行。重复异常是预期行为。谢谢
  • 如果我需要 Map&lt;String, Map&lt;LocaleDate,Entry&gt;&gt; 地图的关键是 Employee::getUsername 怎么办?是否也可以操作按键?
  • @przem 当然,只需将 Entry::getEmployee 替换为 entry -&gt; entry.getEmployee().getUsername()
  • 不,我不能这么简单!!! :-D 非常感谢!像梦一样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多