在数组部分提到数组是不可变的,但是其内部元素却是可变的。下面我们将介绍 Scala 列表,它不同于数组,并且和java.util.List也不一样,一旦创建了就不可改变。

1. 创建列表

Scala 定义列表的方式通常有下面 2 种:

  • [x] 直接指定列表中元素的类型,这种方式定义的列表,不可以存储指定数据类型以外的其他类型数据:

    1. val a = List[Int](1, 2, 3)
  • [x] 借助于 Scala 的类型推断,我们也可以不显式地定义列表中元素的数据类型,并且这种方式定义的列表,可以存储不同数据类型的元素:

    1. val a = List(1, 2, 3)
    2. val b = List(1, "abc")

在某些情况下,我们可以还可能需要创建空数组,Scala 中使用List()或者Nil来创建空数组:

  1. val a = List()
  2. val b = Nil

2. 取值

Scala 取值的方式共有以下 2 种:

  • [ ] 列表的取值方式与数组是一致的,都是通过下标索引进行取值(索引值从 0 开始):

    1. val a = List("a", 10, "z")
    2. a(1) // 10
  • [ ] 使用内置函数获取固定序列,常见的函数有

  • head:返回列表的第一个元素
  • init:除最后一个元素外,返回其他值所组成的列表
  • last:返回列表的最后一个元素
  • [ ] tail:除第一个元素外,返回其他值所组成的列表

    1. val a = List("a", 10, "z")
    2. a.head // a
    3. a.init // List("a", 10)
    4. a.last // z
    5. a.tail // List(10, "z")

    4. 基本属性值

    列表基本属性有 2 个:

  • [ ] length:计算列表的长度

  • [ ] isEmpty:判断列表是否为空

    1. List("a", 10, "z").length // 3
    2. Nil.isEmpty // true

    5. 列表操作

    5.1 删除元素

    列表删除元素共有 3 种:

  • [ ] drop(n):从左往右删除指定n个元素后,返回剩余元素所组成的新列表

  • dropRight(n):从右往做删除指定n个元素后,返回剩余元素所组成的新列表
  • dropWhile(expr):定位到与表达式不匹配的元素,将之前所有元素移除调,返回剩余元素所组成的新列表 ```scala val a = List(1, 2, 3) a.drop(2) // List(3) a.dropRight(2) // List(1)

val b = List(1, 3, 4, 5) a.dropWhile( % 2 != 0) // List(2, 3) b.dropWhile( % 2 != 0) // List(4, 5)

  1. > 🧭 **注意**:在早期的 Scala 版本中,列表还会有一个`remove`方法,目前在 2.13.3 中已经被移除
  2. <a name="soLua"></a>
  3. ## 5.2 添加元素
  4. 向列表添加元素的操作有 3 种:
  5. - [ ] `::`:将指定元素添加到列表头部
  6. - [ ] `:::`:将两个列表进行拼接
  7. - [ ] `appended`:在列表尾部添加指定元素,也可以添加列表,但并不会将两个列表进行拼接
  8. - [ ] `appendedAll`:在列表尾部添加指定元素,它也可以添加列表,并且会将两个列表进行拼接
  9. <a name="gs1o1"></a>
  10. ### 1)两个列表的拼接
  11. Scala 中使用`:::`3 个冒号)来拼接两个列表,从而生成一个新列表:
  12. ```scala
  13. val a = List(1, 2) ::: List(1, "a")
  14. // List(1, 2, 1, "a")

2)添加元素到列表头部

如果与列表拼接的是单个元素的情况,我们使用::(2 个冒号)来进行操作,该操作会将元素1添加到列表的头部,从而生成 一个新列表:

  1. val a = 1 :: List("a", "b")
  2. // List(1, "a", "b")

3)添加元素到列表尾部

  • [ ] 第一种方式是使用appended添加元素到列表的尾部,生成一个新列表:

    1. val a = List(2, 3)
    2. a.appended("a") // List(2, 3, "a")
  • [ ] 第二种方式是使用appendedAll添加元素或列表到列表的尾部,生成一个新列表

    1. val a = List(1, 2)
    2. a.appendedAll(3) // List(1, 2, 3)
    3. a.appendedAll(List("a", "b")) // List(1, 2, "a", "b")

    5.3 列表转字符串

    将列表中的元素以指定分隔符拼接成字符串,在 Python 中通常使用",".join(lst)就完成此功能,但是熟练使用 Python 的同学就知道,使用这种方法的前提是确保列表中所有元素均为字符串类型,否则会报错。Scala 同样也提供了一个 mkString方法用于拼接列表元素,并且更为方便,且不需要将列表中元素均为字符串类型:

    1. val a = List(2, 3, 4, "b")
    2. a.mkString(",") // 2,3,4,b

    5.4 查询

    列表查询的通常有一下几种方法:

  • [ ] exists:判断是否有指定值

  • contains:判断列表是否包含指定元素

5.5 过滤

5.6 遍历

对数组进行遍历,除了使用常规的for循环外,列表还提供了以下方法:

  • forall
  • foreach

5.7 排序

5.9 翻转

列表的翻转比较简单,直接使用reverse函数即可:

  1. val a = List(1, 2, 3)
  2. a.revsese // List(3, 2, 1)