在数组部分提到数组是不可变的,但是其内部元素却是可变的。下面我们将介绍 Scala 列表,它不同于数组,并且和java.util.List
也不一样,一旦创建了就不可改变。
1. 创建列表
Scala 定义列表的方式通常有下面 2 种:
[x] 直接指定列表中元素的类型,这种方式定义的列表,不可以存储指定数据类型以外的其他类型数据:
val a = List[Int](1, 2, 3)
[x] 借助于 Scala 的类型推断,我们也可以不显式地定义列表中元素的数据类型,并且这种方式定义的列表,可以存储不同数据类型的元素:
val a = List(1, 2, 3)
val b = List(1, "abc")
在某些情况下,我们可以还可能需要创建空数组,Scala 中使用List()
或者Nil
来创建空数组:
val a = List()
val b = Nil
2. 取值
Scala 取值的方式共有以下 2 种:
[ ] 列表的取值方式与数组是一致的,都是通过下标索引进行取值(索引值从 0 开始):
val a = List("a", 10, "z")
a(1) // 10
[ ] 使用内置函数获取固定序列,常见的函数有
-
head
:返回列表的第一个元素 -
init
:除最后一个元素外,返回其他值所组成的列表 -
last
:返回列表的最后一个元素 [ ]
tail
:除第一个元素外,返回其他值所组成的列表val a = List("a", 10, "z")
a.head // a
a.init // List("a", 10)
a.last // z
a.tail // List(10, "z")
4. 基本属性值
列表基本属性有 2 个:
[ ]
length
:计算列表的长度[ ]
isEmpty
:判断列表是否为空List("a", 10, "z").length // 3
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)
> 🧭 **注意**:在早期的 Scala 版本中,列表还会有一个`remove`方法,目前在 2.13.3 中已经被移除
<a name="soLua"></a>
## 5.2 添加元素
向列表添加元素的操作有 3 种:
- [ ] `::`:将指定元素添加到列表头部
- [ ] `:::`:将两个列表进行拼接
- [ ] `appended`:在列表尾部添加指定元素,也可以添加列表,但并不会将两个列表进行拼接
- [ ] `appendedAll`:在列表尾部添加指定元素,它也可以添加列表,并且会将两个列表进行拼接
<a name="gs1o1"></a>
### 1)两个列表的拼接
Scala 中使用`:::`(3 个冒号)来拼接两个列表,从而生成一个新列表:
```scala
val a = List(1, 2) ::: List(1, "a")
// List(1, 2, 1, "a")
2)添加元素到列表头部
如果与列表拼接的是单个元素的情况,我们使用::
(2 个冒号)来进行操作,该操作会将元素1
添加到列表的头部,从而生成 一个新列表:
val a = 1 :: List("a", "b")
// List(1, "a", "b")
3)添加元素到列表尾部
[ ] 第一种方式是使用
appended
添加元素到列表的尾部,生成一个新列表:val a = List(2, 3)
a.appended("a") // List(2, 3, "a")
[ ] 第二种方式是使用appendedAll添加元素或列表到列表的尾部,生成一个新列表
val a = List(1, 2)
a.appendedAll(3) // List(1, 2, 3)
a.appendedAll(List("a", "b")) // List(1, 2, "a", "b")
5.3 列表转字符串
将列表中的元素以指定分隔符拼接成字符串,在 Python 中通常使用
",".join(lst)
就完成此功能,但是熟练使用 Python 的同学就知道,使用这种方法的前提是确保列表中所有元素均为字符串类型,否则会报错。Scala 同样也提供了一个mkString
方法用于拼接列表元素,并且更为方便,且不需要将列表中元素均为字符串类型:val a = List(2, 3, 4, "b")
a.mkString(",") // 2,3,4,b
5.4 查询
列表查询的通常有一下几种方法:
[ ]
exists
:判断是否有指定值-
contains
:判断列表是否包含指定元素
5.5 过滤
5.6 遍历
对数组进行遍历,除了使用常规的for
循环外,列表还提供了以下方法:
-
forall
: -
foreach
:
5.7 排序
5.9 翻转
列表的翻转比较简单,直接使用reverse
函数即可:
val a = List(1, 2, 3)
a.revsese // List(3, 2, 1)