【问题标题】:Map Java Stream to Map of Objects with Object as Key将 Java 流映射到以对象为键的对象映射
【发布时间】:2018-08-07 04:36:00
【问题描述】:

我有一些课程,我在 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&lt;Map&lt;WorkDay, Set&lt;LedgerItem&gt;&gt;&gt;,但我想使用收集器将其从 Stream 映射为 Map&lt;WorkDay, Set&lt;LedgerItem&gt;&gt;,但似乎无法让 Collectors.toMap() 语法除了中断之外做任何事情。

就像我说的,一切都很完美,所以我不需要映射之外的任何东西来工作。

仅供参考:createGroupByWorkDay 已经返回 Map&lt;WorkDay, Set&lt;LedgerItem&gt;&gt;,但只接受一个 WorkDay,因为这是一个要求,所以我无法更改它的执行方式...

提前致谢

编辑: 因此,我拥有的createGroupByWorkDay 未在此处列出的方法可以按预期完美运行,并且永远不会改变。它返回正确类型的Map&lt;WorkDay, Set&lt;LedgerItem&gt;&gt;,但只有一个工作日的签名,如createGroupByWorkDay(WorkDay day),原始评论中的问题方法使用该方法构建按工作日分组并返回的单个地图,但可能有N其中的数量,因此方法public Stream&lt;Map&lt;WorkDay, Set&lt;LedgerItem&gt;&gt;&gt; adjustWorkDays(List&lt;WorkDay&gt; workDays) 应该将收集到的所有地图返回到收集器中的一张地图中。如果这有任何意义?

【问题讨论】:

  • workDays.stream() .sorted((d1,d2) -&gt; d1.getCreated().compareTo(d2.getCreated())).collect(Collectors.groupingBy(WorkDay::getDay,Collectors.toSet()));
  • 我已经尝试过了,只是不想这样工作,这就是为什么我很困惑。

标签: java-8 java-stream collectors


【解决方案1】:

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

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

【讨论】:

  • 你成功了,得到了我需要的东西。
猜你喜欢
  • 2023-03-15
  • 2012-07-18
  • 2019-05-27
  • 2018-08-24
  • 1970-01-01
  • 2019-09-19
  • 2021-12-08
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多