2018-12-03 09:33:16
//并行计算求和
val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 单线程聚合
val res = arr.sum
val res = arr.reduce((x,y) => x + y)
val res = arr.reduce(_+_)
//并行聚合(par)线程数不受控制,主要看系统有多少的空闲线程
val res = arr.par.sum //((1+2)+3)+4
val res = arr.par.reduce(_+_)
//按照特定的顺序
//按照特定的顺序进行累加,此时par方法是无效,也就是单线程执行的
val res = arr.par.reduceLeft(_-_) // ((1-2)-3)-4 ...
val res = arr.reduceRight(_-_) // 1-(2-(3-(4-5)))
//折叠:有初始值(无特定顺序)
val res = arr.fold(10)(_+_)
val res = arr.par.fold(10)(_+_)
//折叠:有初始值(有特定顺序)
// foldLeft和reduceLeft方法一样,都属于单线程执行
val res = arr.foldLeft(10)(_+_)
val res = arr.par.foldLeft(10)(_+_)
val res = arr.par.foldRight(10)(_+_)
//聚合(flatten压平,aggregate聚合)
val arr1 = List(List(1, 2, 3), List(3, 4, 5), List(2), List(0))
val res = arr1.flatten.reduce(_+_)
val res = arr1.aggregate(10)((x,y) => x + y.sum, (a,b) => a + b)
val res = arr1.aggregate(10)(_+_.reduce(_+_), _+_)
val res = arr1.par.aggregate(0)(_ + _.reduce(_ + _), _ + _)
// 需求:统计一个聚合结果,结果为一个元组,元组里有两个结果值
// 第一个值是arr数组里所有元素的总和,第二个值是在聚合过程中有多少个数参与计算
// 结果是: (55, 10)
val res = arr.aggregate((0, 0))(
(acc, num) => (acc._1 + num, acc._2 + 1),
(par1, par2) => (par1._1 + par2._1, par1._2 + par2._2)
)
val l1 = List(5, 6, 4, 7)
val l2 = List(1, 2, 3, 4)
//求并集
val res = l1 union l2
val res = l1 ++ l2
//求交集
val res = l1 intersect l2
//求差集
val res = l2 diff l1