Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
reduce()方法如何处理Java 8中的并行流?_Java_Arrays_Java 8_Java Stream_Stringbuilder - Fatal编程技术网

reduce()方法如何处理Java 8中的并行流?

reduce()方法如何处理Java 8中的并行流?,java,arrays,java-8,java-stream,stringbuilder,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.strea

我试图理解
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);

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

问题是你用的,它是专门为你设计的。它既可以用于安全并行存储,也可以用于并行存储。请阅读Oracle官方文档中的差异。与reduce方法不同,reduce方法在处理元素时总是创建新值,collect方法修改或变异现有值

注意这两种方法在JavaDoc中的区别:

  • : 使用提供的标识、累加和组合函数对该流的元素执行缩减

  • : 对该流的元素执行可变缩减操作

因此,我建议您采取以下措施:

StringBuilder concat = Arrays.stream(grades)
    .parallel()
    .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);

•首先处理到达reduce阶段的第一个线程:)如果等待顺序结果,最好使用顺序流,或者至少在reduce操作之前使其顺序化。每次都不同,因为“并行”意味着同时执行多个线程。同时运行意味着它们没有按顺序执行。@VGR我知道并行MEN是多线程的,但是如果我使用collect()而不是reduce(),它即使在并行流中也能很好地工作。这就是一点-一个是可变的reduce,另一个不是。您正在使用
reduce
,就像它是可变的一样,而事实并非如此。提示:
acculator
combiner
必须始终返回
StringBuilder
的新实例。