scala-01-List操作.md
List简介
特性
- 不可变
- 递归结构
- 同构(同质)的:元素的类型必须一致
- 协变的:如果S是T的子类型,那么List[S]是List[T]的子类型,这点不同于java的泛型
- 空列表为List[Nothing],Nil
创建列表
- 所有的List都是由空列表
Nil
和操作符::
构造出来的,::
表示从前端扩张列表. - 实际上,用形如List(e1,e2,…)的方式创建列表在底层也是使用
Nil
和::
构造出来的
|
|
操作
list的基本操作
method | DESC |
---|---|
head | List的第一个元素 |
tail | 除了head之外的其他元素组成的List |
isEmpty | List是否为空 |
last | List的最后一个元素 |
init | 除了last之外的其他元素组成的List |
|
|
list类的一阶方法
连接
列表的链接操作符:::
和扩展元素操作符::
一样都是右结合的,即xs:::ys:::zs
等价于xs:::(ys:::zs)
,不过两个操作数都是List
|
|
长度
内部定义:
|
|
所以,length方法是比较费时的
reverse
反转list:reverse ,该方法并不是在原地修改list,因为list是不可变的,所以会返回一个新的list
- drop和take可以理解为更为广义的tail和init操作
- take(n)返回列表的前n个元素,
if(n>list.length) return list
- drop(n)返回除了take(n)之外的所有元素,
if(n>list.length) return Nil
- splitAt(n)在位置n处拆分列表,返回位元组。等价于
(list.take(n),list.drop(n))
|
|
apply | indices
|
|
zip
不匹配的元素将被遗弃
|
|
mkString
mkString([start,]seperator[,end])
|
|
list类的高阶方法
foreach
遍历list并将传入的lambda作用于每个元素
内部实现:
|
|
遍历
|
|
等价的java8操作
|
|
求和
|
|
map
参数f:T=>R,将f作用于每个元素,并返回类型为R的新列表
构造新list,元素为原list的元素的2倍
|
|
等价的java8代码
|
|
flatMap
和map类型,但请注意返回类型
|
|
filter
|
|
partition
返回二元组(符合条件的部分,不符合条件的部分)
|
|
find
返回第一个满足条件的
|
|
takeWhile | dropWhile | span
- takeWhile(p):返回能够满足p的最长前缀组成的list
- dropWhile(p):返回list中除了takeWhile(n)的部分组成的列表
- span:类似于slitAt结合了take和drop,span结合了takeWhile和dropWhile的结果
|
|
论断(forall,exists)
|
|
折叠
- 1.foldLeft(/:)
内部实现:
|
|
- 2.foldRight(:\)
内部实现:
|
|
- 3.fold
内部实现:
|
|
求和
|
|
乘积
|
|
排序
- 1.sortWith(p: (Int, Int) => Boolean)
|
|