首页 > 解决方案 > Java Map 按键归约

问题描述

我有一个配对列表如下:

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

我的问题是,如何通过键减少扩展对象并获取对列表?

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

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

标签: javajava-8mapreducereduce

解决方案


看起来你需要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());

推荐阅读