列表间映射: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 = 0 scala> 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]])Boolean scala> 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)

scala编程第16章学习笔记(3)——List类的高阶方法的更多相关文章

  1. scala编程第16章学习笔记(4)——List对象的方法

    通过元素创建列表:List.apply List(1, 2, 3) 等价于List.apply(1, 2, 3): scala> List.apply(1, 2, 3) res0: List[I ...

  2. scala编程第16章学习笔记(2)

    转换列表:toIterator, toArray,copyToArray List类的toArray方法将递归存放的列表转换为连续存放的数组 Array类的toList方法将连续存放的数组转换为递归存 ...

  3. scala编程第16章学习笔记(1)

    List列表的基本操作 head方法获得列表的第一个元素 tail方法获得列表除第一个元素之外的其它元素 isEmpty:判断列表是否为空,空的话返回真 last:获得列表最后一个元素 init:获得 ...

  4. scala编程第17章学习笔记(3)

    可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...

  5. scala编程第19章学习笔记(1)——类型参数化

    一.queues函数式队列 函数式队列是一种具有以下三种操作方式的数据结构: head 返回队列的第一个元素. tail 返回除第一个元素之外的队列. scala> import scala.c ...

  6. scala编程第18章学习笔记——有状态的对象

    银行账号的简化实现: scala> class BankAccount{ | private var bal: Int = 0 | def balance: Int = bal | def de ...

  7. scala编程第17章学习笔记(4)——元组

    元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...

  8. scala编程第17章学习笔记(2)——集和映射

    默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...

  9. scala编程第17章学习笔记(1)——集合类型

    列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") ...

随机推荐

  1. WIN10下使用Anaconda配置opencv、tensorflow、pygame并在pycharm中运用

    昨天想运行一段机器学习的代码,在win10系统下配置了一天的python环境,真的是头疼,准备写篇博客来帮助后面需要配置环境的兄弟. 1.下载Anaconda 根据昨天的经历,发现Anaconda真的 ...

  2. 命令:man

    简介 man命令,是manual的缩写,manual表示手册的意思.通过man命令,可以查询大多数shell外部命令的帮助手册. 语法格式 # man [[section] page ...] ... ...

  3. 统计Mongo数组中相同对象的属性之和

    统计Mongo数组中相同对象的属性之和 需求 需要统计app端用户的行为,按天分表,存入mongo.每次用户进行操作的时候,将数据存入app本地,下次用户启动的时候,提交存入mongo,删除app本地 ...

  4. 2018-2019-20172329 《Java软件结构与数据结构》第五周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 <Java软件结构与数据结构>第九章-排序与查找 一.查找 1.查找概念简 ...

  5. QThreadPool线程池的使用,线程与Widget通过信号与槽的方式通信。

    因为QRunnable类并非继承自QObject,不能使用信号和槽,为了能够使用信号与槽和Widget通信,需要对QRunnable进行封装. 定义一个类QMyRunnable,该类首先继承自QObj ...

  6. j.u.c系列(04)---之AQS:同步状态的获取与释放

    写在前面 在前面提到过,AQS是构建Java同步组件的基础,我们期待它能够成为实现大部分同步需求的基础.AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态,对于子类 ...

  7. Dell PowerEdge R710服务器内存条插法/Dell 11G/12G系列服务器内存条插法(转)

    说明:以我的经验,其实插3/6/9这个顺序去一定没有错. DELL PowerEdge R710服务器支持 DDR3的 DIMM (RDIMM) 或 ECC非缓冲的 DIMM(UDIMM).单列和双列 ...

  8. Gson通过借助TypeToken获取泛型参数的类型的方法(转)

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

  9. LPC43xx SGPIO Experimentation

    LPC4350 SGPIO Experimentation The NXP LPC43xx microcontrollers have an interesting, programmable ser ...

  10. 在centos中安装jenkins master为service

    需要sudo或root权限.    翻译自: https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+dis ...