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

时间:2018-08-07 04:36:00

标签: java-8 java-stream collectors

我有一些类,并且我在包含List 的List 中做一些工作,除一部分外,我所有的工作都在进行。好吧,它行得通,但并不是我想要的那样。

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>>>,但我想使用收集器将其从流中映射为Map<WorkDay, Set<LedgerItem>>,但似乎无法获得Collectors.toMap()语法来执行任何操作但会失败。

就像我说的那样,一切正常,所以我不需要映射之外的任何东西。

仅供参考:createGroupByWorkDay已经返回Map<WorkDay, Set<LedgerItem>>,但是仅接受一个WorkDay,因为这是一项要求,因此我无法更改其执行方式...

预先感谢

编辑: 因此,此处未列出的我拥有的createGroupByWorkDay方法可以按预期工作,并且永远不会更改。它返回正确类型的Map<WorkDay, Set<LedgerItem>>,但只有一个createGroupByWorkDay(WorkDay day)这样的WorkDay签名,原始注释中使用该方法构建按WorkDay分组并返回的单个Map,但是,可能有N个,因此方法public Stream<Map<WorkDay, Set<LedgerItem>>> adjustWorkDays(List<WorkDay> workDays)应该将所有收集到的Map返回到收集器中的一个map中。如果有意义的话?

1 个答案:

答案 0 :(得分:3)

我不清楚您的问题。但是我想你可能会问这样的事情?

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