对象中字符串属性的第三个参数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)