首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java-Stream,具有重复键的toMap

Java-Stream,具有重复键的toMap
EN

Stack Overflow用户
提问于 2018-02-07 02:21:08
回答 3查看 7.3K关注 0票数 10

因此,可能有一个abc用于多个付款,现在我有:

代码语言:javascript
复制
//find abc id for each payment id
Map<Long, Integer> abcIdToPmtId = paymentController.findPaymentsByIds(pmtIds)
          .stream()
          .collect(Collectors.toMap(Payment::getAbcId, Payment::getPaymentId));

但是后来我意识到这个可能有重复的键,所以我希望它返回一个

代码语言:javascript
复制
Map<Long, List<Integer>> abcIdToPmtIds 

其中一个条目将包含一个abc和他的多个付款。

我知道我可以使用groupingBy,但是我想我只能使用Map<Long, List<Payments>>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-07 02:23:04

使用另一个groupingBy重载。

代码语言:javascript
复制
paymentController.findPaymentsByIds(pmtIds)
      .stream()
      .collect(
          groupingBy(Payment::getAbcId, mapping(Payment::getPaymentId, toList());
票数 14
EN

Stack Overflow用户

发布于 2019-02-09 06:58:07

问题陈述:正在转换SimpleImmutableEntry<String, List<String>> -> Map<String, List<String>>

例如,您有一个形式为[A,1],[B, 2 ],[A,3]的SimpleImmutableEntry,您希望您的地图看起来像这样:A -> 1,3,B -> 2。

这可以使用Collectors.toMap来完成,但是Collectors.toMap只能使用唯一键,除非您提供合并功能来解决java文档中所说的冲突。

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function-java.util.function.BinaryOperator-

因此,示例代码如下所示:

代码语言:javascript
复制
          .map(returnSimpleImmutableEntries)
          .collect(Collectors.toMap(SimpleImmutableEntry::getKey,
                                    SimpleImmutableEntry::getValue,
                                    (oldList, newList) -> { oldList.addAll(newList); return oldList; } ));

returnSimpleImmutableEntries方法返回[A,1]、[B,2]、[A,3]形式的条目,您可以在这些条目上使用收集器。

票数 3
EN

Stack Overflow用户

发布于 2018-02-07 02:26:33

使用Collectors.toMap

代码语言:javascript
复制
Map<Long, Integer> abcIdToPmtId = paymentController.findPaymentsByIds(pmtIds)
    .stream()
    .collect(Collectors.toMap(
        Payment::getAbcId, 
        p -> new ArrayList<>(Arrays.asList(p.getPaymentId())),
        (o, n) -> { o.addAll(n); return o; }));

尽管与Collectors.mapping一起使用Collectors.groupingBy更清晰、更具可读性。

不过,你不需要streams来做到这一点:

代码语言:javascript
复制
Map<Long, Integer> abcIdToPmtId = new HashMap<>();
paymentController.findPaymentsByIds(pmtIds).forEach(p ->
    abcIdToPmtId.computeIfAbsent(
            p.getAbcId(),
            k -> new ArrayList<>())
        .add(p.getPaymentId()));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48649513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档