Java 元素可以属于多个组的流分组
我正在尝试使用streams api groupingby收集器获取映射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++){
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));