博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战
阅读量:6161 次
发布时间:2019-06-21

本文共 2294 字,大约阅读时间需要 7 分钟。

 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(_>_)) } }

转载地址:http://kzefa.baihongyu.com/

你可能感兴趣的文章
Spring如何处理线程并发
查看>>
linux常用命令(用户篇)
查看>>
获取组件的方式(方法)
查看>>
win2008 server_R2 自动关机 解决
查看>>
我的友情链接
查看>>
在C#调用C++的DLL简析(二)—— 生成托管dll
查看>>
Linux macos 常用终端操作
查看>>
企业网络的管理思路
查看>>
Linux磁盘分区与挂载
查看>>
J2se学习笔记一
查看>>
DNS视图及日志系统
查看>>
老李分享:Android性能优化之内存泄漏 3
查看>>
mysql命令
查看>>
来自极客标签10款最新设计素材-系列七
查看>>
极客技术专题【009期】:web技术开发小技巧
查看>>
PHP 简单计算器代码实现
查看>>
正则表达式的知识普及
查看>>
docker使用笔记
查看>>
华为eNSP模拟器上实现FTP服务
查看>>
【全球AI人才排行榜】美国第一,中国仅排名第7
查看>>