对象中字符串属性的第三个参数Java8 reduce

对象中字符串属性的第三个参数Java8 reduce,java,lambda,java-8,java-stream,reduce,Java,Lambda,Java 8,Java Stream,Reduce,对于流大师来说,问题很简单: 我有这个: List<MyBean> beans = new ArrayList<>(); beans.add(new MyBean("tutu")); beans.add(new MyBean("toto")); beans.add(new MyBean("titi")); 及 为什么,第二个解决方案无法编译。。。第三个参数用于并行流 您能解释一下为什么我无法编译第二个代码部分吗?这种行为是因为: 另一方面

对于流大师来说,问题很简单:

我有这个:

    List<MyBean> beans = new ArrayList<>();
    beans.add(new MyBean("tutu"));
    beans.add(new MyBean("toto"));
    beans.add(new MyBean("titi"));

为什么,第二个解决方案无法编译。。。第三个参数用于并行流


您能解释一下为什么我无法编译第二个代码部分吗?

这种行为是因为:

另一方面,这种过载:

reduce(U标识、双功能累加器、二进制运算符组合器)
接受a作为第二个参数,该参数可以使用两种不同类型的对象,因此第一个代码段可以在没有编译器错误的情况下工作

最后,不要忘记将
beans.parallelStream()
更改为
beans.stream()
,如上面的解决方案所示

另外,请注意,在并行执行操作时,累加器和组合器必须是,并且。如果不考虑这一点,您的结果将是不确定的任意结果

编辑:

如所述:

在缩减函数中修改传入参数会被 定义,即使它碰巧在一个特定的环境中产生了预期的结果 顺序上下文。这也违反了第一方的合同 参数,因为修改后的
StringBuilder
不是标识值 不再您可以对不可变值使用reduce,如下所示
.map(MyBean::getName).reduce((a,b)->a+“,”+b).orElse(“”)或使用
类变约化
.map(MyBean::getName).collect(收集器.joining(“,”))


这不仅仅是旁注。修改缩减函数中的传入参数会被定义破坏,即使它碰巧在顺序上下文中产生了预期的结果。它还违反了第一个参数的约定,因为修改后的
StringBuilder
不再是标识值。您可以对不可变值使用reduce,如
.map(MyBean::getName).reduce((a,b)->a+“,“+b).orElse(“”)
或使用可变reduce,如
.map(MyBean::getName).collector(Collectors.joining(“,”)
…@Holger-true,这是完全有意义的。我会在帖子中引用你的建议。非常感谢。
 StringBuilder reduced
            = beans.parallelStream()
                    .map(MyBean::getName)
                    .reduce(new StringBuilder(), (builder, name) -> {
                        if (builder.length() > 0) {
                            builder.append(", ");
                        }

                        builder.append(name);
                        return builder;
                    }, (left, right) -> left.append(right));
 StringBuilder reduced
            = beans.parallelStream()
                    .map(MyBean::getName)
                    .reduce(new StringBuilder(), (builder, name) -> {
                        if (builder.length() > 0) {
                            builder.append(", ");
                        }

                        builder.append(name);
                        return builder;
                    }/* WITHOUT THIRD PARAM*/);
reduce(T identity, BinaryOperator<T> accumulator)
StringBuilder reduced
                = beans.stream()
                .map(b -> new StringBuilder(b.getName()))
                .reduce(new StringBuilder(), (builder, name) -> {
                    if (builder.length() > 0) {
                        builder.append(", ");
                    }

                    builder.append(name);
                    return builder;
                }/* WITHOUT THIRD PARAM*/);
reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)