java8 并行,Java8流的顺序执行和并行执行产生不同的结果?

小编典典

从reduce的文档中:

身份值必须是累加器功能的身份。这意味着对于所有t,accumulator.apply(identity,t)等于t。

在您的情况下,这是不正确的-“”和“ a”创建了“ / a”。

我已经提取了累加器功能并添加了打印输出以显示发生了什么:

BinaryOperator accumulator = (s1, s2) -> {

System.out.println("joining \"" + s1 + "\" and \"" + s2 + "\"");

return s1 + "/" + s2;

};

System.out.println(Stream

.of("a", "b", "c", "d", "e", "f")

.parallel()

.reduce("", accumulator)

);

这是示例输出(运行之间有所不同):

joining "" and "d"

joining "" and "f"

joining "" and "b"

joining "" and "a"

joining "" and "c"

joining "" and "e"

joining "/b" and "/c"

joining "/e" and "/f"

joining "/a" and "/b//c"

joining "/d" and "/e//f"

joining "/a//b//c" and "/d//e//f"

/a//b//c//d//e//f

您可以在函数中添加if语句以分别处理空字符串:

System.out.println(Stream

.of("a", "b", "c", "d", "e", "f")

.parallel()

.reduce((s1, s2) -> s1.isEmpty()? s2 : s1 + "/" + s2)

);

正如Marko Topolnik所注意到的,s2由于累加器不必是可交换的函数,因此不需要进行检查。

2020-09-24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值