Java 元素可以属于多个组的流分组

Java 元素可以属于多个组的流分组,java,java-stream,groupingby,Java,Java Stream,Groupingby,我正在尝试使用streams api groupingby收集器获取映射groupId->元素列表。我的例子的特殊之处在于,一个元素可以属于多个组 用一个简单的例子来演示:假设我想使用数字2-10作为分组的标识符,并想将数字2-40分组,以便将它们视为标识符的倍数。传统上我会这样做: Map<Integer,List<Integer>> map = new HashMap<>(); for(int i = 2; i < 11; i++){

我正在尝试使用streams api groupingby收集器获取映射
groupId->元素列表
。我的例子的特殊之处在于,一个元素可以属于多个组

用一个简单的例子来演示:假设我想使用数字
2-10
作为分组的标识符,并想将数字
2-40
分组,以便将它们视为标识符的倍数。传统上我会这样做:

Map<Integer,List<Integer>> map = new HashMap<>();
    for(int i = 2; i < 11; i++){
        for(int j = 2; j < 41; j++){
            if(j%i == 0)
            map.computeIfAbsent(i, k -> new ArrayList<>()).add(j);
        }
    }
    map.forEach((k,v) -> {
        System.out.println(k + " : " + v);
    });
为了使用streams,我尝试将问题的答案应用到我的案例中,但没有成功

IntStream.range(2, 11).boxed()
            .flatMap(g -> IntStream.range(2, 41)
                .boxed()
                .filter(i -> i%g == 0)
                .map(i -> new AbstractMap.SimpleEntry<>(g,i))
            .collect(Collectors.groupingBy(Map.Entry::getKey, 
                    Collectors.mapping(Map.Entry::getValue, Collectors.toList()))));
IntStream.range(2,11).boxed()
.flatMap(g->IntStream.range(2,41)
.boxed()
.filter(i->i%g==0)
.map(i->newAbstractMap.SimpleEntry(g,i))
.collect(Collectors.groupingBy(Map.Entry::getKey、,
Collectors.mapping(Map.Entry::getValue,Collectors.toList());
我得到一个编译错误

不兼容类型:推理变量R#1的边界不兼容 等式约束:映射
下限:Stream你是说像这样的smthg

Map<Integer,List<Integer>> v = IntStream.range(2, 11).boxed()
               .map(g -> IntStream.range(2, 41)
                       .boxed()
                       .filter(i -> i % g == 0)
                       .map(i -> new AbstractMap.SimpleEntry<>(g, i))
                       .collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey,
                               Collectors.mapping(AbstractMap.SimpleEntry::getValue, Collectors.toList()))))
               .flatMap(m -> m.entrySet().stream())
               .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map v=IntStream.range(2,11).boxed()
.map(g->IntStream.range(2,41)
.boxed()
.filter(i->i%g==0)
.map(i->newAbstractMap.SimpleEntry(g,i))
.collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey、,
Collectors.mapping(AbstractMap.SimpleEntry::getValue,Collectors.toList()))
.flatMap(m->m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

感谢您的回复,但我需要生成的地图类型为
map
您的建议确实很有帮助。我替换了最后一个
.collect(Collectors.toList()).flatMap(m->m.entrySet().stream()).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue))并获得了所需的结果。Thankswa只是一个快速的破解,但我认为,它可以用一种更简单的方式完成。啊,毕竟还不算太糟。到目前为止,您使用
map.computeIfAbsent
的原始代码要比流式版本好得多。它在性能和可读性方面也更好/expresiveness@fps你是对的。但我正在为初级开发人员学习一门课程,我必须想出一个使用streams的解决方案。
Map<Integer,List<Integer>> v = IntStream.range(2, 11).boxed()
               .map(g -> IntStream.range(2, 41)
                       .boxed()
                       .filter(i -> i % g == 0)
                       .map(i -> new AbstractMap.SimpleEntry<>(g, i))
                       .collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey,
                               Collectors.mapping(AbstractMap.SimpleEntry::getValue, Collectors.toList()))))
               .flatMap(m -> m.entrySet().stream())
               .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));