【问题标题】:Collect List into a Map<Object1 , Map<Object2, Object3>> in Java 8在 Java 8 中将 List 收集到 Map<Object1 , Map<Object2, Object3>>
【发布时间】:2017-10-19 09:29:13
【问题描述】:

我想迭代一个对象列表。每个对象都包含一些对象变量。更具体地说:

public class KCenterDocumentMapping {
    private DigitalFileCategory digitalFileCategory;
    private DocumentType documentType;
    private KCenterCategory kCenterCategory;
    private KCenterFolder kCenterFolder;
    private KCenterDocumentType kCenterDocumentType;

    //setters & getters
}

我的清单是:

List<KCenterDocumentMapping> allMappings = db4.retrieveMapping();

所需的地图结构是:

Map<DigitalFileCategory, Map<DocumentType, KCenterDocumentMapping>> kCenterDocumentMappingMap = new HashMap<>();

在我当前的实现中,我收到“无法从静态上下文引用非静态方法”。

Map<DigitalFileCategory, Map<DocumentType,KCenterDocumentMapping>> grouping = kCenterDocumentMappingList.stream()
                .collect(Collectors.groupingBy(KCenterDocumentMapping::getDigitalFileCategory,
                        Collectors.mapping(KCenterDocumentMapping::getDocumentType, this)));

有什么想法吗?

【问题讨论】:

  • 不再使用映射,而是再次使用 groupingBy。不需要“这个”。

标签: java lambda java-8 java-stream


【解决方案1】:
Collectors.mapping(KCenterDocumentMapping::getDocumentType, this) // this?

我想你正在寻找的是:

Collectors.toMap(KCenterDocumentMapping::getDocumentType,
         Function.identity())

Collectors.mapping 接受 FunctionCollector 作为输入; this 看起来不像 Collector

【讨论】:

  • 编译并得到这个:原因:java.lang.IllegalStateException: Duplicate key KCenterDocumentMapping: 39 at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java。 util.HashMap.merge(HashMap.java:1253) 在 java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320) 在 java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java: 909) 在 java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
  • @pkont 很明显,你确实有一个重复的Key。您需要以某种方式在逻辑上合并它们。当你有两次相同的钥匙时会发生什么?你想把你的价值观收集成一个List 可能吗?所以它会变成Map&lt;DocumentType, List&lt;KCenterDocumentMapping&gt;&gt;
  • 从检索到的列表中可以看出,我没有重复。 “列表”的复合键是 DigitalFileCategory 和 DocumentType 的组合
  • @pkont 你显然有一个重复的密钥,否则你不会得到异常
  • @AKSW 或 groupingBy(KCenterDocumentMapping::getDocumentType, Collectors.toList)
猜你喜欢
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2018-01-06
  • 2015-07-26
  • 2019-01-23
  • 2015-03-20
  • 2013-10-14
  • 2013-12-20
相关资源
最近更新 更多