Scala的foldLeft和foldRight

简介: <div style="margin:0px; padding:0px; border:0px; line-height:1.6; font-family:'Helvetica Neue',Arial,'Hiragino Sans GB',STHeiti,'Microsoft YaHei','WenQuanYi Micro Hei',SimSun,Song,sans-serif; font


Scala的foldLeft和foldRight

FoldLeft

定义如下:

  override /*TraversableLike*/
  def foldLeft[B](z: B)(f: (B, A) => B): B = {
    var acc = z
    var these = this
    while (!these.isEmpty) {
      acc = f(acc, these.head)
      these = these.tail
    }
    acc
  }
  • z the start value
  • f 操作函数(累积器,these.head)

注意:类型

也可以这么写 /: 或者 :\ ,scala做了简化:

def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)

def :\[B](z: B)(op: (A, B) => B): B = foldRight(z)(op)

举个简单的例子:

List(1,2,3).foldLeft(0)((sum,i)=>sum+i)
res21: Int = 6

acc = z
acc = 0 + List.head
List = List.tail
acc = acc + List.head
...

再举个比较复杂的例子:

 //times(List('a', 'b', 'a')) --> List(('a', 2), ('b', 1))
  def times(chars: List[Char]): List[(Char, Int)] = {
    def incr(pairs: List[(Char, Int)], C: Char): List[(Char, Int)] =
      pairs match {
        case Nil => List((C, 1))
        case (C, n) :: ps => (C, n+1) :: ps
        case p :: ps => p :: incr(ps, C)
      }
    chars.foldLeft(List[(Char,Int)]())(incr)
  }

也可以用富操作的写法:

(list foldLeft 0)(sum)
(chars foldLeft List[(Char, Int)]())(incr)

总结一下

foldRight就是逆序集合,然后调用foldLeft. (Ps:我的scala版本2.9.3)

foldLeft的简写 /:
这个是foldLeft的简写吧,个人理解。
如果我写一个累加的程序

scala> (0/:(1 to 100))(_+_)  
res32: Int = 5050

其实是等价于

scala> (1 to 100).foldLeft(0)(_+_)  
res33: Int = 5050

foldRight的简写 :\
这个就是foldRight的简写吧,个人理解。
如果我写一个递减的程序

scala> ((1 to 5):\100)((i,sum)=> sum-i)

Reference

http://blog.csdn.net/oopsoom/article/details/23447317


目录
相关文章
|
SQL 消息中间件 分布式计算
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
671 0
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
|
2月前
|
分布式计算 Java Scala
spark 与 scala 的对应版本查看、在idea中maven版本不要选择17,弄了好久,换成11就可以啦
spark 与 scala 的对应版本查看、.在idea中maven版本不要选择17,弄了好久,换成11就可以啦
110 2
|
2月前
|
分布式计算 数据处理 Scala
Spark 集群和 Scala 编程语言的关系
Spark 集群和 Scala 编程语言的关系
29 0
|
3月前
|
分布式计算 Java Scala
Spark编程语言选择:Scala、Java和Python
Spark编程语言选择:Scala、Java和Python
Spark编程语言选择:Scala、Java和Python
|
11月前
|
存储 分布式计算 Scala
Spark-RDD 键值对的操作(Scala版)
Spark-RDD 键值对的操作(Scala版)
|
11月前
|
SQL 存储 JSON
人人都懂Spark-SQL基础操作(Scala版)
人人都懂Spark-SQL基础操作(Scala版)
|
11月前
|
JSON 分布式计算 算法
Spark-编程进阶(Scala版)
Spark-编程进阶(Scala版)
|
11月前
|
JSON 分布式计算 Hadoop
Spark-数据读取与保存(Scala版)
Spark-数据读取与保存(Scala版)
|
11月前
|
存储 缓存 分布式计算
Spark RDD编程基础(Scala版)
Spark RDD编程基础(Scala版)