Java 8 流 API : how to use GroupingBy to have the same object in multiple groups?

标签 java java-stream

我有以下类(class):

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);
        });
    });

关于Java 8 流 API : how to use GroupingBy to have the same object in multiple groups?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58522482/

相关文章:

java - Tomcat 中的连接池与单例?

java - 大于 Long.MAX_VALUE 的 long

java - 类型不接受泛型中的参数

java - 流状态计算 : cumulative sums

lambda - 如何使用 Java 8 Streams 和 Lambda 迭代引用父元素的嵌套 for 循环?

java - 它如何使用流删除重复对象并从对象字段中减去值?

java - 递归中使用的 C 代码语句的等效 java 代码语句

java - Intellij 13 JSF 对 Spring Beans 的支持

java - 创建并发集合,不从 Stream : Java 加载内存中的数据

Java-Stream - 使用单个流对字符串中的数据进行拆分、分组和映射