Java8:在流上执行reduce操作
我得到了一个java.util.stream.stream,其中包含键值对,如:Java8:在流上执行reduce操作,java,java-8,java-stream,reduce,Java,Java 8,Java Stream,Reduce,我得到了一个java.util.stream.stream,其中包含键值对,如: <1,3> <1,5> <3,1> <4,2> <4,7> <4,8> 现在,我想合并所有具有相同密钥的条目: <1,[3,5]> <3,[1]> <4,[2,7,8]> 数据已经排序,因此只需合并连续的数据集 现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中 我更希望得
<1,3> <1,5> <3,1> <4,2> <4,7> <4,8>
现在,我想合并所有具有相同密钥的条目:
<1,[3,5]> <3,[1]> <4,[2,7,8]>
数据已经排序,因此只需合并连续的数据集
现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中
我更希望得到一个java.util.stream.stream作为结果,其对象类型包含一个值列表,而不是一个值
我唯一的方法是一个自定义迭代器,它执行合并,但是转换为迭代器并返回到流似乎非常难看
最好的方法是什么?以下是我们的解决方案
您可以用数据集
对象替换int[]
。我们可以添加peek
来验证它是否是延迟加载/计算:
StreamEx.of(datasets) //
.peek(System.out::println) //
.collapse((a, b) -> a[0] == b[0], groupingBy(a -> a[0], mapping(a -> a[1], toList()))) //
.limit(1) //
.forEach(System.out::println);
你已经找到了可能是最好的选择。流实际上并不适合您想要的操作类型。我认为
.groupBy()
操作可能会根据流中的内容而工作@然而,LouisWasserman可能更好地理解您的需求。@KevinO,OP明确表示,他们不希望结果是a流,并避免将数据加载到内存中groupingBy
不允许您这样做。@tsolakp如果我的理解正确的话:OP已经有办法将其db结果集转换成流。他只是不想将所有结果集加载到内存中以获得结果(天真地使用stream.groupBy()
会产生这种恶劣的效果)@Andreas:a拆分器
并不比迭代器
丑陋。更简单。
StreamEx.of(datasets) //
.peek(System.out::println) //
.collapse((a, b) -> a[0] == b[0], groupingBy(a -> a[0], mapping(a -> a[1], toList()))) //
.limit(1) //
.forEach(System.out::println);