文章目录
第 16、17、22、24、25 章
1.
2. 列表
2.1 列表的声明
注意点:
- 同一个列表的所有元素都必须是相同的类型
- Scala的列表类型是协变的,对每一组类型S和T,如果S是T的子类型,那么List[S]就是List[T]的子类型
- 空列表的类型为List[Nothing]。在类继承关系中,Nothing是底类型,所以对于任何T而言,List[Nothing]都是List[T]的子类型
- 所有的列表都构建自两个基础的构建单元
:Nil
,::
。Nil表示空列表,::表示在列表前追加元素。
列表定义语法:
val fruit1:List[String] = List("apple","orange","pear")
// 也可以这样定义
val fruit2:List[String] = "apple"::("orange"::("pear"::Nil))
val fruit3 = "apple"::"orange"::"pear"::Nil
// 空列表的定义
val empty01 = List()
val empty02 = Nil
列表与数组的区别:
- 列表是不可变的,列表的元素不能通过赋值改变
- 列表的结构是递归的,即链表。而数组是平的
2.2 列表的基本操作
操作 | 说明 |
---|---|
head | 返回列表的第一个元素 |
tail | 返回列表中除第一个元素之外的所有元素 |
isEmpty | 返回列表是否为空列表 |
::: | :::接收两个列表参数作为操作元形成一个新列表 |
last | 返回(非空)列表的最后一个元素 |
init | 返回除了最后一个元素之外剩余的部分 |
head、tail、last、init用于空列表会报错
2.3 列表模式
列表也可以用模式匹配解开,列表模式可以逐一对应到列表表达式。
下面两种匹配方式略有差别
val fruit1:List[String] = List("apple","orange","pear")
val List(a1, b1, c1) = fruit1
println(s"a:$a1, b:$b1, c:$c1") // a:apple, b:orange, c:pear
val a2::b2::c2 = fruit1
println(s"a:$a2, b:$b2, c:$c2") // a:apple, b:orange, c:List(pear)