java - 为什么 Java 流图会减少我的结果两次?

标签 java java-8 java-stream reduce

我有这个代码:

        ComparisonResults comparisonResults = requestsList
                .stream()
                .map(item -> getResponse(item))
                .map(item -> compareToBl(item))
                .reduce(new ComparisonResults(), (result1, result2) ->
                {
                     result1.addSingleResult(result2);
                 //   return result1;
                    return new ComparisonResults(result1);
                });

和这个代码b:

        ComparisonResults comparisonResults = requestsList
                .parallelStream()
                .map(item -> getResponse(item))
                .map(item -> compareToBl(item))
                .reduce(new ComparisonResults(), (result1, result2) ->
                {
                     result1.addSingleResult(result2);
                 //   return result1;
                    return new ComparisonResults(result1);
                });

我所做的就是创建响应对象,然后将它们转换为 comaprisonResult 对象并将它们缩减为一个 comaprisonResult。

代码 a 显示了一个 int 类成员 comparisonResults.num_of_sub_responses==5 这是正确的

code b 显示了一个 int 类成员 comparisonResults.num_of_sub_responses==10 是正确结果的两倍。

java 8 reduce 应该是线程安全的,对吧?

我错过了什么吗?

getResponsecompareToBl 是线程安全的

最佳答案

您正在改变 reduce 中的传入对象。这是错误的。 修改传入对象后创建新对象对您没有帮助。

你想做的是

.collect(ComparisonResults::new, ComparisonResults::addSingleResult,
         (a,b)->/* code to merge two ComparisonResults instances*/);

如果 .map(item -> compareToBl(item)) 的结果是 ComparisonResults 或者换句话说,addSingleResult 合并了两个ComparisonResults 实例,您可以使用 ComparisonResults::addSingleResult 作为合并函数,尽管它的名称有点误导。

您应该仔细阅读 “Reduction” chapter of the documentation及其后续内容“可变缩减”。

关于java - 为什么 Java 流图会减少我的结果两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375335/

相关文章:

java - 类型集合的 toArray 方法未定义

java - 有没有办法在java中创建用户定义类类型的数组?

java - Tomcat 似乎无法释放线程

使用 lambda 的 Java 过滤器

java - 使用 Java Stream API 进行分层过滤

java - 在 Java 中重载按位运算符

java - 禁止空字符串参数和抛出 RuntimeException 以阻止方法继续进行的优缺点

Java 8 具有 Stream API、Lambda 以及与 java 7 的简洁代码比较

java - 如何处理 Java 8 Stream 中的异常?

java - 处理 'not' 条件作为流操作中的方法引用