java-8 - 将 Java 流映射到以对象为键的对象映射
问题描述
我有一些课程,我正在一个包含 List<LedgerItem> 的 List<WorkDay> 中做一些工作,除了一个部分之外,我的一切都在工作。好吧,它有效,但不完全是我想要的。
public Stream<Map<WorkDay, Set<LedgerItem>>> adjustWorkDays(List<WorkDay> workDays) {
return workDays.stream()
.sorted((d1,d2) -> d1.getCreated().compareTo(d2.getCreated()))
.map(day -> createGroupByWorkDay(day))/*need it to collect here*/;
}
如果您可以看到返回类型是Stream<Map<WorkDay, Set<LedgerItem>>>
,但我想将其映射到 Stream 之外,就像Map<WorkDay, Set<LedgerItem>>
使用收集器一样,但似乎除了中断之外无法获得Collectors.toMap()
任何语法来做任何事情。
就像我说的,一切都很完美,所以我不需要映射之外的任何东西来工作。
仅供参考:已经createGroupByWorkDay
返回Map<WorkDay, Set<LedgerItem>>
,但只接受一个WorkDay
,因为这是一个要求,所以我不能改变它的执行方式......
提前致谢
编辑:所以我createGroupByWorkDay
没有在这里列出的方法可以按预期完美运行,并且永远不会改变。它返回正确的类型,Map<WorkDay, Set<LedgerItem>>
但只有一个 WorkDay 的签名,createGroupByWorkDay(WorkDay day)
原始评论中的相关方法使用该方法构建按 WorkDay 分组并返回的单个地图,但可能有 N 个,所以方法public Stream<Map<WorkDay, Set<LedgerItem>>> adjustWorkDays(List<WorkDay> workDays)
应该将收集到的所有地图返回到收集器中的一张地图中。如果那有意义的话?
解决方案
你的问题我不清楚。但我想你可能会要求这样的东西?
Map<WorkDay, List<LedgerItem>> result = workDays.stream()
.collect(Collectors.toMap(Function.identity(), WorkDay::getLedgerItems));
如果不是,请清楚地解释您的问题陈述。这只是一个猜测。
这里有更新,
Map<WorkDay, List<LedgerItem>> result = workDays.stream()
.map(d -> createGroupByWorkDay(d))
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
推荐阅读
- javascript - 如何插入 @Html.DisplayFor(m => m.EventDetailSection.ContactAccountTel)
- javascript - 我究竟做错了什么。我想显示没有时间戳的日期但添加 50 天
- maven - 如何在 maven repo 下获取所有 pom.xml
- c# - 将用户名和密码移动到 ASP.NET Core Identity
- python - chrome 驱动程序无头选项不适用于链接?
- react-native - 更改 TextInput onFocus 和 onBlur.React-Native 时的样式
- sql - 获取每个单词oracle的第一个字符?
- linux - IPPROTO_TCP 或 SOL_SOCKET
- algorithm - 在数组中查找数字条以匹配目标数组
- javascript - 如何将位置值设置为初始负载的每个分辨率都相同?