我正在学习Java 8,在Java的归约运算部分。util。stream的包摘要,它说:
更正式地说,标识值必须是组合器函数的标识。这意味着对于所有u,组合器。应用(恒等式,u)等于u。此外,组合器函数必须是关联的,并且必须与累加器函数兼容:对于所有u和t,组合器。应用(u,累加器。应用(恒等式,t))必须等于累加器()。应用(u,t)。
我不明白为什么身份值必须是组合器函数的身份。我认为“组合器函数必须是关联的并且必须是兼容的”足以产生相同的结果,无论流是串行的还是并行的。
例如,我有一个流,它有四个元素:e1、e2、e3、e4。如果它是一个串行流,则结果是acidentity
ac
e1
ac
e2
ac
e3
ac
e4
(ac表示累加器功能)。如果这是一个并行流,那么这四个元素可以分为两部分,
[e1,e2]
和
[e3,e4]
,因此结果是(
identity
ac
e1
ac
e2
)co(
identity
ac
e3
ac
e4)。
如果给定“组合器函数是关联的并且与累加器函数兼容”,我们可以推断“
identity
ac
e1
ac
e2
ac
e3
ac
e4
”等于“(
identity
ac
e1
ac
e2
)co(
identity
ac
e3
ac
ac
e4
):
identity ac e1 ac e2 ac e3 ac e4
= (identity ac e1 ac e2 ac e3) co (identity ac e4) // because of compatibility
= (identity ac e1 ac e2) co (identity ac e3) co (identity ac e4) // because of compatibility
= (identity ac e1 ac e2) co ((identity ac e3) co (identity ac e4)) // because of associative property
= (identity ac e1 ac e2) co ((identity ac e3) ac e4) // because of compatibility
= (identity ac e1 ac e2) co (identity ac e3 ac e4)
那么,为什么标识值必须是组合器函数的标识?
相关问题:
java-Stream reduce()需求究竟需要什么堆栈溢出
我不理解为什么标识值必须是组合器函数的标识。
必须这样,否则,如果提供的流为空,则无法生成结果。但用恒等式归约的结果不是可选的。您可以在不使用标识的情况下定义Java 8精简:
java prettyprint-override">OptionalInt sum = Arrays.stream(new int[] { 0, 2, 6 }).reduce((a, b) -> a + b);
但是,如果您这样做,空流将不会返回有效结果,因为还原操作不“知道”0
是您定义的“sum”操作的中性元素。Im数学术语,您正在定义操作的标识元素,以便在操作根本不适用的情况下进行回退。直观地,您可以这样描述操作:
减少=op(单位,a,b,c…)
这就是为什么您会收到OptionalInt,这意味着可能没有计算出整数值。
对于乘法,恒等式为1;对于和,恒等式为0。由于恒等式必须为中性,因此从最严格的意义上讲,它不是回退,因为回退可以是任何值,包括-1或任何其他值(不得为数字值)。因此Optionant提供了一个很好的替代方案,因为有了optional,您可以应用或(fallback)
方法,该方法不需要是约简的中性元素。
我已经升级到Xcode 7,突然我的一个目标无法使用“宏名称必须是标识符”消息构建。此目标的调试配置构建正常,我可以在设备上运行它,但发布配置不会构建。 错误指向目标的.pch文件,但对于许多其他目标(包括已发布的目标),相同的.pch文件构建正常。 以下是错误消息: 这是。pch文件: 我已经尝试过清理和Xcode重启。 我将非常感谢任何关于如何深入挖掘并找到问题所在的建议。
我仔细检查配置的存储帐户中是否有一个容器: 我没有改变其他任何东西。下面是 run.csx: 当我按下运行按钮时,出现以下错误: 2017-05-12T13:47:35.567 执行函数时出现异常:Functions.BlobTriggerCSharp1.Microsoft.Azure.WebJobs.Host:发生一个或多个错误。异常绑定参数“myBlob”。Microsoft.Azure.We
我正在使用SODA for Java存储和检索Oracle12c DB中的文档。我正在效仿这个例子。 这一例外背后的原因将是什么?
这是我的程序:
我尝试用Axon配置cqrs和事件源。SeatReseveCreateCommand工作正常。但是SeatReserveUpadateCommand工作不正确。 这是我的SeatReserve集合 这是我的控制器 更新导致此错误 我怎么解决这个。
问题内容: 在阅读Hibernate文档时,我不断看到对 自然标识符 概念的引用。 这是否仅表示实体因其拥有的数据的性质而具有的ID? 例如,用户名+密码+年龄+某些内容用作复合标识符? 问题答案: 在Hibernate中,自然键通常用于查找。在大多数情况下,您将拥有一个自动生成的代理ID。但是,此ID对于查找而言毫无用处,因为您将始终通过名称,社会保险号或其他来自现实世界的字段进行查询。 在使用