当前位置: 首页 > 知识库问答 >
问题:

有序流上的减少是否按顺序减少?

邹丰羽
2023-03-14

我有一个a、B、C的列表。

C减少A减少B!=A减少B减少C(但是,A减少(B减少C)是可以的)。

换句话说,我的约化运算是关联的,但不是交换的。

java是否在有序的顺序流(例如列表中的默认流)上强制执行减少将始终根据遇到顺序发生?也就是说,java会重新排序减少(例如B减少A而不是A减少B)吗?

(希望这足够清楚)。

编辑添加一个小演示,也许有助于澄清

Stream.of(" cats ", " eat ", " bats ")
  .reduce("", (a, b) -> a + b); // cats eat bats

有了以上这些,输出会是“蝙蝠猫吃”还是“蝙蝠猫吃”?这在规范中有保证吗?


共有3个答案

双恩
2023-03-14

让我担心的是reduce文档中的这条简介“这相当于……但不限于按顺序执行。”

执行顺序与遭遇顺序不同。流管道允许执行“猫”(“吃”“蝙蝠”)(“猫”“吃”)“蝙蝠”

糜昌胤
2023-03-14
匿名用户

你一次问了两个问题。

  1. java是否在一个有序的顺序流(比如列表中的默认流)上强制执行,减少总是根据遭遇顺序进行的

假设“总是会发生”指的是函数求值的顺序,答案是否定的,这是不能保证的。

Stream.of(" cats ", " eat ", " bats ")
  .reduce("", (a, b) -> a + b); // cats eat bats

无论归约函数的求值顺序(处理顺序)如何,结果都保证是“猫吃蝙蝠”,正确反映了遭遇顺序(另请参见此答案)。为了确保未指定的处理顺序仍然会产生与遭遇顺序有关的正确结果,按照规定,缩减函数必须是关联的

请注意,留档甚至显示. duce(", String::concat)作为有效但低效的约简函数的示例。类似地,(a, b)-

文档的“关联性”部分给出了关键点:

如果以下条件成立,则运算符或函数op是关联的:

(a op b) op c == a op (b op c)

如果我们将其扩展到四个术语,就可以看出这对平行评估的重要性:

a op b op c op d == (a op b) op (c op d)

因此,我们可以与(c op d)并行计算(a op b),然后对结果调用op

关联操作的示例包括数字加法、最小值和最大值以及字符串连接。

宋智明
2023-03-14

根据规范,它尊重元素的顺序。

证明很简单。该规范声称,约简函数必须是关联的。

然而,如果不保留顺序,联想性本身就没有任何意义。根据联想属性的数学定义

在包含同一关联运算符的一行中两个或多个引用的表达式中,只要操作数的顺序不变,执行操作的顺序就无关紧要。

换句话说,关联属性并不意味着:

(a + b) + c = (a + c) + b

它只允许对应用操作的顺序进行任意排列。

 类似资料:
  • 在我的项目中,我使用Java中Vert.x的实现。到目前为止一切都很顺利。然而,目前我有问题执行一个动作的对象列表顺序。问题在于方法在Java中分别“reduce”和“sombining”结果。这将导致所有操作同时启动。实现顺序执行是可能的,可以在方法中看到这一点。 执行Easy时的输出: 和的输出与Java代码的easy方法相同。我正在寻找的是一种修复Java中reduce方法的方法,或者一种实

  • 问题内容: 有什么办法可以限制celery的工人数量?我的服务器很小,celery总是在1个核心处理器上创建10个进程。我想将此数目限制为3个进程。 问题答案: 我尝试在我的settings.py文件中将并发设置为1,将max_tasks_per_child设置为1,并同时运行3个任务。它仅以用户的身份生成1个进程,而以Celery的形式生成其他2个进程。它应该只运行1个进程,然后等待它完成,然后

  • 我对库伯内特斯的世界是陌生的。我正试图在我的个人项目上实现库伯内茨的优势。 我在docker容器中有一个api服务,它从后端获取数据。 我计划在kubernetes集群中的单个外部端口上创建此api服务容器的多个副本。如果副本在单个节点上,它们是否共享流量? 我的最终目标是创建此api服务的多个实例,以使我的应用程序更快(用户可以访问多个api服务中的一个,这将减少单个实例上的流量)。 我在kub

  • 问题内容: 假设我有一个布尔值流,而我正在编写的reduce操作是||(OR)。我是否可以这样编写它:如果true遇到值,则放弃对至少某些元素的求值? 我正在寻找某种程度的优化(也许是并行流),不一定要完全优化,尽管后者会很棒。 问题答案: 我怀疑您想要这种构造。 你可以看一下 Stream.of(1, 2, 3, 4).peek(System.out::println).anyMatch(i -

  • 问题内容: 我认为使用某种顺序才有意义。我想做的是在视图中包括该子句,以便该视图上的所有s都可以忽略它。但是,我担心该订单不一定会延续到,因为它没有指定订单。 是否存在一种情况,即视图指定的顺序不会反映在该视图上的select结果中(该视图中的order by子句除外)? 问题答案: 您不能指望没有显式子句的任何查询中的行顺序。如果查询有序视图,但没有包括子句,则如果它们的顺序正确,请感到惊喜,并

  • 问题内容: 背景 我有一个Spring批处理程序,该程序读取一个文件(我正在使用的示例文件的大小约为4 GB),对该文件进行少量处理,然后将其写到Oracle数据库中。 我的程序使用1个线程读取文件,并使用12个工作线程进行处理和数据库推送。 我正在搅动很多年轻一代的记忆,这使我的程序运行得比我想象的要慢。 建立 JDK 1.6.18 春季批处理2.1.x 4核计算机,带16 GB内存 问题 使用