Java的8个流API:如何使用GroupingBy有多个组相同的对象?

1Z10:

我有以下类:

public class A{
    public List<String> groups;
}

我试图建立一个Map<String, List<A>>其中关键代表组。

我知道如何当A类属于一个组做:

List<A> aList = getAList();
Map<String, List<A>> aByGroupMap = aList.stream().parallel()
           .collect(Collectors.groupingBy(a -> a.getGroup()));

但如何能适应以这样的方式,上面的代码,对象A被映射到多个组?例如,如果对象a1所属的群体["G", "H", "I"]和对象A2所属的组["H", "I"]

厄立特里亚:

你可以尝试这样的事:

Map<String, List<A>> aByGroupMap = aList.stream()
    .flatMap(a -> a.getGroups().stream()
            .map(g -> new AbstractMap.SimpleEntry<>(g , a)))
    .collect(Collectors.groupingBy(Map.Entry::getKey,
            Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

或者,如果你有一个小先前已知的一套您的组像

Set<String> myGroups = Set.of("A","B","C");

你可以这样做:

Map<String,List<A>> map = new HashMap<>();
    myGroups.forEach(g -> {
        aList.stream().filter(a -> a.getGroups().contains(g)).forEach(a ->{
            map.computeIfAbsent(g, s -> new ArrayList<>()).add(a);
        });
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何组值从Java流API(groupingBy集电极)名单?

GroupingBy使用Java 8流

Java 8流-使用流将相同类型的多个对象映射到列表

Java的8个流groupingBy与定制逻辑

从使用Java 8个流API对象列表收集名单

如何使用Java 8个流跨越多个列表?

如何使用Java 8个流API遍历枚举值

Java的8个流 - 共享相同的ID对象的合并集合

Java流groupingBy嵌入对象

使用Java 8流API按多个属性对对象进行分组

如何筛选使用Java 8个流两个列表对象?

在Java中8个流API多个集合函数

Java的8个流API,如何收集清单对象与几个字段列表

Java 8流分组 如果只有一个分组值对象,如何设置字段?

是否有可能使用在Android API <24的Java 8个流API?

流API如何对多级嵌套类使用groupingBy?

如何使用带有对象列表的 java 8 流获取一些统计信息

Java8流使用流畅的API减少对象列表

Java的8流 - 如何合并从具有相同的字段列表中的元素,以一个元素和总结

使用Java流的复杂对象组列表

访问空组的流时,使Java 8 groupingBy-based映射“空安全”

如何使用Java 8流映射到多个元素?

如何GROUPBY对象的属性和映射到使用Java 8流另一个对象?

如何使用Java 8流对对象进行排序

Java 8流组

Java的8流groupingBy集电极

Java的8个流API否则容易使用

使用Java 8个流API嵌套表上的筛选

Java 8 流:如何使用 groupingBy(.) 将 Map<String, List<Integer>> 转换为 Map<Integer, List<String>>