首页 > 解决方案 > 将 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)应该将收集到的所有地图返回到收集器中的一张地图中。如果那有意义的话?

标签: java-8java-streamcollectors

解决方案


你的问题我不清楚。但我想你可能会要求这样的东西?

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

推荐阅读