java - 在 Java 8 中,reduce() 方法如何处理并行流?

标签 java arrays java-8 java-stream stringbuilder

我试着理解 reduce()方法完全适用于并行流,我不明白为什么以下代码不返回这些字符串的串联。

这是代码:

public class App {

    public static void main(String[] args) {
        String[] grades = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"};

        StringBuilder concat = Arrays.stream(grades).parallel()
                .reduce(new StringBuilder(),
                        (sb, s) -> sb.append(s),
                        (sb1, sb2) -> sb1.append(sb2));

        System.out.println(concat);

    }
}

该代码仅适用于顺序流,但对于并行流,它不会返回串联。每次输出都不一样。有人能解释一下那里发生了什么吗?

最佳答案

问题是你用了 Stream::reduce Mutable reduction , 已 Stream::collect 专为。它既可以用于安全的并行存储。也可以在 Oracle 官方文档 Streams: Reduction 中了解这些差异。 .与在处理元素时总是创建新值的 reduce 方法不同,collect 方法修改或改变现有值。

请注意 JavaDoc 中两种方法之间的差异:

  • reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner) :

    Performs a reduction on the elements of this stream, using the provided identity, accumulation and combining functions.

  • collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner) :

    Performs a mutable reduction operation on the elements of this stream.


  • 因此,我建议您执行以下操作:
    StringBuilder concat = Arrays.stream(grades)
        .parallel()
        .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
    

    关于java - 在 Java 8 中,reduce() 方法如何处理并行流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56023452/

    相关文章:

    java - 如何使用 Stream.flatmap 将被展平的对象与展平的对象组合起来

    java - java 中的打印在 Windows 7 中无法完成

    java - 在 Java 中从最后一个节点到第一个节点遍历 TreeSet 的最佳方法是什么?

    java - Spring Security - 身份验证的用户名在 AuthenticationSuccessHandler 中为空

    arrays - 更新 redux 数组中的多个项目

    java - 为什么 Java 8 中的接口(interface)允许有 main 方法?

    java - 为 IntelliJ 项目设置 java SDK

    java - 谷歌应用程序引擎上的 JPA 类型 ("XXX")不是实体的实体,但需要用于此操作

    python - 在 Python 列表中生成不在同一索引中重复的随机值

    c++ - 创建一个 const char* const* 数组