聚合在scala中是如何工作的?

聚合在scala中是如何工作的?,scala,Scala,我知道普通骨料在scala中是如何工作的,以及它的使用。试图了解下面的代码是如何工作的,但是没有。有人能帮我解释一下它是如何工作的,并给我一个(10,4)的输出吗 有人能帮我解释一下它是如何工作的,并给我一个输出吗 of(10,4) 使用聚合时,提供三个参数: 从分区中累积元素的初始值,通常是中性元素 给定分区的函数将在其中累积结果 组合两个分区的函数 因此,在您的例子中,分区的初始值是元组(0,0) 然后,您定义的累加器函数将对正在遍历的当前元素与元组的第一个元素求和,并将元组的第二个元素

我知道普通骨料在scala中是如何工作的,以及它的使用。试图了解下面的代码是如何工作的,但是没有。有人能帮我解释一下它是如何工作的,并给我一个(10,4)的输出吗

有人能帮我解释一下它是如何工作的,并给我一个输出吗 of(10,4)

使用聚合时,提供三个参数:

  • 从分区中累积元素的初始值,通常是中性元素
  • 给定分区的函数将在其中累积结果

  • 组合两个分区的函数

因此,在您的例子中,分区的初始值是元组(0,0)

然后,您定义的累加器函数将对正在遍历的当前元素与元组的第一个元素求和,并将元组的第二个元素增加1。事实上,它将计算分区中元素的总和及其元素数

组合器函数组合了两个元组。正如您所定义的,它将求和并计算2个分区的元素数。在您的案例中不使用它,因为您按顺序遍历管道。您可以在列表中调用
.par
,这样您就可以得到一个并行实现来查看正在运行的组合器(请注意,它必须是一个关联函数)

因此得到(10,4),因为1+2+3+4=10,列表中有4个元素(添加了4个元素)

您可以在累加器函数(在顺序输入上运行)中添加打印语句,以查看其行为:

Acc: (0,0) - value:1
Acc: (1,1) - value:2
Acc: (3,2) - value:3
Acc: (6,3) - value:4
我知道普通骨料在scala中是如何工作的,以及它的使用

对于顺序输入,
aggregate
是一个
foldLeft

def aggregate[B](z: =>B)(seqop: (B, A) => B, combop: (B, B) => B): B = foldLeft(z)(seqop)
对于并行输入,列表被分为多个块,以便多个线程可以分别工作。累加器函数使用初始值在每个块上运行。当两个线程需要合并其结果时,将使用combine函数:

def aggregate[S](z: =>S)(seqop: (S, T) => S, combop: (S, S) => S): S = {
  tasksupport.executeAndWaitResult(new Aggregate(() => z, seqop, combop, splitter))
}
这是fork-join模型的原理,但它要求任务可以很好地并行化。这里就是这种情况,因为一个线程不需要知道另一个线程的结果来完成它的工作

def aggregate[S](z: =>S)(seqop: (S, T) => S, combop: (S, S) => S): S = {
  tasksupport.executeAndWaitResult(new Aggregate(() => z, seqop, combop, splitter))
}