Java Map 按键归约

Posted

技术标签:

【中文标题】Java Map 按键归约【英文标题】:Java Map Reduce By Key 【发布时间】:2021-06-13 11:31:15 【问题描述】:

我有一个配对列表如下:

// pairs = [(k1, obj1), (k2, obj1)]
List<Pair<String, Object> pairs;

那我想把那些对象展开成很多对象,然后按键化简

pairs.stream().map(pair -> 
                // every object is expanded into many objects, obj11, obj12, ...
                List<Object> objects = expand(pair.getRight());
                // the return is [(k1, obj11), (k1, obj12), (k2, obj21), (k2, obj22)]
                return objects.stream().map(object -> new MutablePair<String, Object>(pair.getLeft(), object)).collect(Collectors.toList());
            ).reduce(...
                // how to reduce it by key and get a list of pairs 
            ...);

我的问题是,如何通过key减少展开的对象并得到pairs列表?

我的意思是预期的结果是:

pairs = [(k1, obj11), (k1, obj12), (k2, obj21), (k2, obj22)]

【问题讨论】:

【参考方案1】:

看起来您需要flatMap 而不是map,以及collect 而不是reduce

List<Pair<String, Object>> expandedPairs =
    pairs.stream()
         .flatMap(pair -> expand(pair.getRight()).stream()
                                                 .map(object -> new MutablePair<String, Object>(pair.getLeft(), object)))
         .collect(Collectors.toList());

【讨论】:

谢谢,但是展开返回 List? @geek-techcode 是的,然后您将 List&lt;Object&gt;map 每个 Object 流式传输到 MutablePairflatMap 将这些小流的所有 Pairs 扁平化为单个 Stream of Pairs。 对不起我之前的评论,它有效,非常感谢;)

以上是关于Java Map 按键归约的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中按键对 Map 值进行排序?

使用Java8 Stream API对Map按键或值进行排序

Java学习笔记5.4.2 Map接口 - TreeMap类

在Java中按键或值对地图进行排序[重复]

c++ map基础知识、按键排序、按值排序

Java HashMap 按键插入时间排序 - 创意顺序 [重复]