Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8:在流上执行reduce操作_Java_Java 8_Java Stream_Reduce - Fatal编程技术网

Java8:在流上执行reduce操作

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]> 数据已经排序,因此只需合并连续的数据集 现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中 我更希望得

我得到了一个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]>

数据已经排序,因此只需合并连续的数据集

现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中

我更希望得到一个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);