将 Java Stream 映射到以对象为键的对象映射

Mic*_*elM 2 java-8 java-stream collectors

我有一些课程,并且正在 List<WorkDay> 中做一些工作,其中包含一个 List<LedgerItem>,除了一部分之外,我一切正常。嗯,它有效,但不完全是我想要的。

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*/;
}
Run Code Online (Sandbox Code Playgroud)

如果您可以看到返回类型是,Stream<Map<WorkDay, Set<LedgerItem>>>但我想将其映射到流之外,就像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)应该返回收集到收集器中的一张地图中的所有地图。如果那有意义的话?

Rav*_*ala 5

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

Map<WorkDay, List<LedgerItem>> result = workDays.stream()
                .collect(Collectors.toMap(Function.identity(), WorkDay::getLedgerItems));
Run Code Online (Sandbox Code Playgroud)

如果没有,请清楚地解释您的问题陈述。这只是一个猜测。

这是一个更新,

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));
Run Code Online (Sandbox Code Playgroud)