java – 流减少身份与幂等值

java.util.stream软件包文档在还原的上下文中给出了此标识的定义:

the identity value must be an identity for the combiner function. This means that for all u, combiner.apply(identity, u) is equal to u.

Stream.reduce()及其原始对应物提供了类似的定义.

据我所知,这个定义对于支持并行流是必要的.例如,用于总和减少的非零种子值可以乘以并行处理器的数量,从而不可预测地扭曲最终结果.

但是这个定义似乎比支持并行性更加严格.为什么不需要idempotent值x,这样combiner.apply(x,x)等于x?这将保护Integer :: sum,(a,b) – >等函数. a * b和String :: concat来自多个进程的偏移,同时仍然允许使用具有幂等函数的任何种子,如Math :: max,(a,b) – > a | b和Sets::intersection.

我忽略了身份价值是否有一些独特的好处?

解决方法:

仅仅问“为什么不呢?”是不够的.并提供一些不会导致问题的示例.您必须提供一个证明,即通过这种宽松的要求,可以保证顺序和并行评估能够产生相同的正确结果.

让我们使用2参数reduce来简化问题.我们也将自己限制在一个包含2个元素(a,b)的流中.让身份成为我和累积者是操作.

按顺序评估时,结果为(i op a)op b.当并行评估时,它可能是(i op a)op(i op b)(或者甚至可能存在裸体i,但现在不要担心).我们希望这两者都等于操作

如果要求我是一个身份,很容易看到顺序和并行评估都是正确的.但是,如果我们所需要的只是i op i = i,那么它显然不会跟随(i op a)op(i op b)必须等于任何关联op和任何a和b的op b.

我能想到的一个反例是空间崩溃连接:(x,y) – > (x y).replaceAll(“”,“”).它是关联的,“”是幂等的,但不是关于这个函数的身份.并行和顺序评估将产生不同的结果.

上一篇:java – 使用流元素之间的相关性过滤流


下一篇:关于 JDBC 连接 数据库 MYSQL ??? 中文问号乱码解决