scala编程第16章学习笔记(3)——List类的高阶方法
列表间映射:map、flatMap和foreach
1.xs map f 操作返回把函数f应用在xs的每个列表元素之后由此组成的新列表。如:
scala> List(1, 2, 3) map (_ + 1) res0: List[Int] = List(2, 3, 4)scala> val words = List("the", "quick", "brown", "fox") words: List[String] = List(the, quick, brown, fox)scala> words map (_.length) res1: List[Int] = List(3, 5, 5, 3)scala> words map (_.toList.reverse.mkString) res2: List[String] = List(eht, kciuq, nworb, xof)
2.flatMap操作符与map类似,不过它的右操作元是能够返回元素列表的函数。它对列表的每个元素调用该方法,然后连接所有方法的结果并返回。map与flatMap的差异举例说明如下:
scala> words map (_.toList) res3: List[List[Char]] = List(List(t, h, e), List(q, u, i, c, k), List(b, r, o, w, n), List(f, o, x))scala> words flatMap (_.toList) res4: List[Char] = List(t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x)
List.range是可以创建某范围内所有整数列表的工具方法。例如:
scala> List.range(1, 5) flatMap (i => List.range(1, i) map (j => (i, j))) res6: List[(Int, Int)] = List((2,1), (3,1), (3,2), (4,1), (4,2), (4,3))
3.foreach是第三种与映射类似的操作。它的右操作元是过程(返回Unit的函数)。它只是对每个列表元素都调用一遍过程。操作的结果仍然是Unit,不会产生结果列表。例如:
scala> var sum = 0 sum: Int = 0scala> List(1, 2, 3, 4, 5) foreach (sum += _)scala> sum res9: Int = 15
列表过滤:filter、partition、find、takeWhile、dropWhile和span
1.xs filter p操作产生xs中符合p(x)为true的所有元素组成的列表。如:
scala> List (1, 2, 3, 4, 5) filter (_ % 2 == 0) res10: List[Int] = List(2, 4)scala> words filter (_.length == 3) res11: List[String] = List(the, fox)
2.partition方法与filter类似,不过返回的是列表对。其中一个包含所有论断为真的元素,另一个包含所有论断为假的元素。
xs partition p 等价于 (xs filter p, xs filter (!p()))
举例如下:
scala> List(1, 2, 3, 4, 5) partition (_ % 2 ==0) res12: (List[Int], List[Int]) = (List(2, 4),List(1, 3, 5))
3.find方法同样与filter方法类似,不过返回的是第一个满足给定论断的元素,而并不是全部。xs find p 操作以列表xs和论断p为操作元。返回可选值。如果xs中存在元素x使得p(x)为真,Some(x)将返回。否则,若p对所有元素都不成立,None将返回。举例如下:
scala> List(1, 2, 3, 4, 5) find (_ % 2 == 0) res13: Option[Int] = Some(2)scala> List(1, 2, 3, 4, 5) find (_ <= 0) res15: Option[Int] = None
4. xs takeWhile p操作返回列表xs中最长的能够满足p的前缀。例如:
scala> List(1, 2, 3, -4, 5) takeWhile (_ > 0) res16: List[Int] = List(1, 2, 3)
5.xs dropWhile p操作移除最长能够满足p的前缀。举例如下:
scala> words dropWhile (_ startsWith "t") res17: List[String] = List(quick, brown, fox)
6.span方法把takeWhile和dropWhile组合成一个操作。它返回一对列表,定义与下列等式一致:
xs span p 等价于 (xs takeWhile p, xs dropWhile p)
scala> List(1, 2, 3, -4, 5) span (_ >0) res18: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5))
列表的论断:forall和exists
1. xs forall p 如果列表的所有元素满足p则返回true。
2. xs exists p 如果列表中有一个值满足p就返回true。
例如,要找出以列表的列表形式表达的矩阵是否有全为零的行:
scala> def hasZeroRow(m: List[List[Int]]) = m exists (row => row forall (_ == 0)) hasZeroRow: (m: List[List[Int]])Booleanscala> val m= List(List(3,0,0), List(0,3,0), List(0,0,3)) m: List[List[Int]] = List(List(3, 0, 0), List(0, 3, 0), List(0, 0, 3))scala> hasZeroRow(m) res21: Boolean = false
折叠列表:/:和:\
scala> def sum(xs: List[Int]): Int = (0 /: xs) (_ + _) sum: (xs: List[Int])Int
sum(List(a, b, c)) 等价于 0 + a + b + c
scala> def product(xs: List[Int]): Int = (1 /: xs) (_ * _) product: (xs: List[Int])Int
product(List(a, b, c)) 等价于 1 * a * b * c
左折叠操作“(z /: xs) (op)” 与三个对象有关:开始值z,列表xs,以及二元操作op。折叠的结果op应用到前缀值z及每个相邻元素上。
:\操作符被称为右折叠。与左折叠一样带有三个操作元,不过前两个的出现次序相反:第一个操作元是待折叠的列表,第二个是开始值。(xs \: z) (op)
列表排序:sortWith
对列表xs的操作,xs sortWith before,可以对列表的元素执行排序,其中“before”是比较元素的方法。举例如下:
scala> List(1, -3, 4, 2, 6) sortWith (_ < _) res2: List[Int] = List(-3, 1, 2, 4, 6) scala> words sortWith (_.length > _.length) res5: List[String] = List(quick, brown, the, fox)
转载于:https://www.cnblogs.com/gaopeng527/p/4102937.html
scala编程第16章学习笔记(3)——List类的高阶方法相关推荐
- scala编程第16章学习笔记(1)
List列表的基本操作 head方法获得列表的第一个元素 tail方法获得列表除第一个元素之外的其它元素 isEmpty:判断列表是否为空,空的话返回真 last:获得列表最后一个元素 init:获得 ...
- scala编程第18章学习笔记——有状态的对象
银行账号的简化实现: scala> class BankAccount{| private var bal: Int = 0| def balance: Int = bal| def depos ...
- scala编程第17章学习笔记(2)——集和映射
默认情况下在使用"Set"或"Map"的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版 ...
- Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法
函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...
- 《小马哥讲Spring核心编程思想》-第一章学习笔记(1)
<小马哥讲Spring核心编程思想>-第一章学习笔记(1) 一.课程介绍 1.为什么要学习spring? 2.深入学习spring的难点有哪些? 3.课程的设计思路是怎样的? 二.内容综述 ...
- C++程序设计教程(钱能)第四章 学习笔记
C++程序设计教程(钱能)第四章 学习笔记 4.1 名词解释与操作符 4.1.1 名词解释 4.1.2 操作符汇总 4.1.3 操作符的说明 4.2 算数运算问题 4.2.1 周而复始的整数 4.2. ...
- NVIDIA可编程推理加速器TensorRT学习笔记(二)——实操
NVIDIA可编程推理加速器TensorRT学习笔记(二)--实操 TensorRT 是 NVIDIA 自家的高性能推理库,其 Getting Started 列出了各资料入口,如下: 本文基于博 ...
- 知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别
知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别 知识图谱的概念,与传统语义网络的区别 狭义概念 作为语义网络的内涵 与传统语义网络的区别 优点 缺点 与 ...
- 工程伦理第三章学习笔记2020最新
工程伦理第三章学习笔记2020最新 因为之前自己在网上找答案总是觉得费劲,一道一道的找,很慢,突然找到了前两章的答案,感觉有一种前人种树后人乘凉的感觉,于是自己在艰难找完第三章习题并全对的情况下,将题 ...
最新文章
- Test class should have exactly one public constructor解决办法
- bzoj 1207: [HNOI2004]打鼹鼠
- 首次使用eclipes运行项目报错“Java.lang.ClassNotFoundException”
- 运维从业人员是否需要考证?
- Vasya and Multisets CodeForces - 1051C 模拟|分类讨论
- mybatis依赖_Spring Boot2 系列教程(二十一)整合 MyBatis
- 回文字符串(51Nod-1092)
- PHP常见概念混淆(五)之PHP类常量、静态属性和属性的区别
- Docker实现隔离
- 三轴合并_用两套乐高60107合并成铰接式云梯消防车,看看和60112有什么区别
- 从USB驱动器运行Windows 10
- cuda 和 cudnn 下载与安装
- Face3D学习笔记(3)3DMM示例源码解析【上】准备工作
- 【动手学深度学习】01 Windows下安装环境
- 京东手机登录页面html,京东登录页面.html
- java实现word文件转图片,支持分页
- ios能玩java的模拟器_app适用于模拟器,但不适用于ios设备
- requests爬取IT橘子
- 计算机组成原理第三次实验(静态随机存储器实验)
- 个性代码注释 大合集
热门文章
- 计算机组成原理—浮点数
- 腾讯校园招聘笔试 2019-8-17 第四题 另一种解法
- 循环冗余检错码CRC
- 利用SQL建立数据库
- bzoj 3895: 取石子(博弈)
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
- [Python] 字典 vars()函数:以字典类型提取对象的属性和属性值
- python机器学习案例系列教程——极大似然估计、EM算法
- 安卓运行时监听配置更改:sim卡、本地语言、键盘显示或隐藏、字体大小、UI模式、屏幕方向、屏幕布局(另一个屏幕)、可用屏幕大小(横纵向)、无屏幕大小(外接屏幕)。
- Echarts数据可视化开发参数配置全解