Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战

Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6 
腾讯微云:http://url.cn/TnGbdC 
360云盘:http://yunpan.cn/cQ4c2UALDjSKy   访问密码 45e2

以下为第37讲List的foldLeft、foldRight、sort操作代码实战

package com.parllay.scala.dataset

/** * Created by richard on 15-7-22. */object List_Fold_Sort {

  def main(args: Array[String]) {

    /**     * Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战     *     * 本质上说,fold函数将一种格式的输入数据转化成另外一种格式返回。fold, foldLeft和foldRight这三个函数除了有一点点不同外,做的事情差不多。      val numbers = List(5, 4, 8, 6, 2)      numbers.fold(0) { (z, i) =>            z + i      }      // result = 25   List中的fold方法需要输入两个参数:初始值以及一个函数。输入的函数也需要输入两个参数:累加值和当前item的索引。    那么上面的代码片段发生了什么事?  代码开始运行的时候,初始值0作为第一个参数传进到fold函数中,list中的第一个item作为第二个参数传进fold函数中。  1、fold函数开始对传进的两个参数进行计算,在本例中,仅仅是做加法计算,然后返回计算的值;  2、Fold函数然后将上一步返回的值作为输入函数的第一个参数,并且把list中的下一个item作为第二个参数传进继续计算,同样返回计算的值;  3、第2步将重复计算,直到list中的所有元素都被遍历之后,返回最后的计算值,整个过程结束;  4、这虽然是一个简单的例子,让我们来看看一些比较有用的东西。早在后面将会介绍foldLeft函数,并解释它和fold之间的区别,    目前,你只需要想象foldLeft函数和fold函数运行过程一样。

     fold, foldLeft, and foldRight之间的区别  主要的区别是fold函数操作遍历问题集合的顺序。foldLeft是从左开始计算,然后往右遍历。foldRight是从右开始算,然后往左遍历。    而fold遍历的顺序没有特殊的次序。来看下这三个函数的实现吧(在TraversableOnce特质里面实现)

     def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)     def foldLeft[B](z: B)(op: (B, A) => B): B = {       var result = z       this.seq foreach (x => result = op(result, x))       result     }

     def foldRight[B](z: B)(op: (A, B) => B): B =     reversed.foldLeft(z)((x, y) => op(y, x))  由于fold函数遍历没有特殊的次序,所以对fold的初始化参数和返回值都有限制。在这三个函数中,初始化参数和返回值的参数类型必须相同。  第一个限制是初始值的类型必须是list中元素类型的超类。在我们的例子中,我们的对List[Int]进行fold计算,而初始值是Int类型的,它是List[Int]的超类。  第二个限制是初始值必须是中立的(neutral)。也就是它不能改变结果。比如对加法来说,中立的值是0;而对于乘法来说则是1,对于list来说则是Nil。

  顺便说下,其实foldLeft和foldRight函数还有两个缩写的函数:    def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)

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

    scala> (0/:(1 to 100))(_+_)          res32: Int = 5050    scala> ((1 to 100):\0)(_+_)    res24: Int = 5050     */    println((1 to 100).foldLeft(0)(_+_))    println((0 /: (1 to 100))(_+_))

    println((1 to 5).foldRight(100)(_-_))    println(((1 to 5):\ 100)(_-_))

    println(List(1, -3, 4, 2, 6) sortWith(_<_))    println(List(1, -3, 4, 2, 6) sortWith(_>_))

  }

}
时间: 2024-10-19 16:13:44

Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战的相关文章

Scala深入浅出实战经典:29,Case class和Case object代码实战解析

今天学习了王家林老师scala讲座的第29讲,case class和case object的应用实战.做下记录. 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark 关注微信账号,获取更多关于王家林老师的课程内容 王老师QQ:1740415547 微信号:18610086859 话不多说,让我们从代码出发: abstract class People//定义抽象类case class Student(age:Int) extends People//定义case class,继承抽象类c

第37讲:List的foldLeft、foldRight、sort操作代码实战

其实flodLeft和foldRight就是折叠操作,我让们看下下列的函数 折叠操作 def sum(xs:List[Int]):Int = ( 0 /: xs)(_ +_) def product(xs:List[Int]):Int=( 1 /: xs)(_ *_) (fruit.head /: fruit.tail)(_ + " " + _) //用空格连接列表中每个元素 列表排序 sort println(List(1,-4,3,2,6).sortWith(_<_))//L

Scala 深入浅出实战经典 第39讲:ListBuffer、ArrayBuffer、Queue、Stack操作代码实战

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③

Scala 深入浅出实战经典 第40讲:Set、Map、TreeSet、TreeMap操作代码实战

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③

List的map、flatMap、foreach、filter操作代码实战之Scala学习笔记-27

package com.leegh.dataset /** * @author Guohui Li */object List_HighOrder_Function_Ops { def main(args: Array[String]): Unit = { println(List(1, 2, 3, 4, 6) map (_ + 1)) val data = List("Scala", "Hadoop", "Spark") println(dat

List的一阶函数操作代码实战详解之Scala学习笔记-24

package com.leegh.dataset /** * @author Guohui Li */object List_FirstOrder_Ops { def main(args: Array[String]): Unit = { println(List(1, 2, 3, 4) ::: List(4, 5, 6, 7, 8) ::: List(10, 11)) println(List(1, 2, 3, 4) ::: (List(4, 5, 6, 7, 8) ::: List(10,

第33讲:List的一阶函数操作代码实战详解

操作的参数不是函数,就是一阶函数 我们通过具体的代码来说明: package com.dt.scala.dataset object ListFirstOrderOps {   def main(args: Array[String]): Unit = {     //列表合并,使用:::操作符     println(List(1,2):::List(3,4):::List(5,6))     println(List(1,2):::(List(3,4):::List(5,6)))     /

第40讲:Set、Map、TreeSet、TreeMap操作代码实战

今天来看下set map的操作,让我们从代码出发 val data = mutable.Set.empty[Int] data ++= List(1,2,3)//在空set上加入列表 data += 4//在set上加入新元素 data --= List(2,3) println(data) //Set(1, 4)data += 1println(data)//Set(1, 4),说明Set元素不能重复data.clear() println(data)//Set() 我们可以看出,Set和Li

第35讲:List的map、flatMap、foreach、filter操作代码实战

List的Map函数的作用: map的参数是一个函数,List中的每个元素都应用于这个函数,并且返回一个新的集合. 例如我们有一个List(1,2,3,4) ,我们需要构建List(2,4,6,8) 那么我们就可以使用Map函数,传入一个*2的函数 如下: scala> val list = List(1,2,3,4) list: List[Int] = List(1, 2, 3, 4) scala> list.map(x => x*2) res0: List[Int] = List(2