List 是 Scala 中非常重要的一个数据结构,其与 Array(数组) 非常类似,但是 List 是不可变的,和 Java 中的 List 一样,其底层实现是链表。
scala>vallist=List("hadoop", "spark", "storm")list:List[String] =List(hadoop, spark, storm)// List 是不可变scala> list(1) ="hive"<console>:9:error: value update is not a member of List[String]
2. List类型
Scala 中 List 具有以下两个特性:
同构 (homogeneous):同一个 List 中的所有元素都必须是相同的类型;
协变 (covariant):如果 S 是 T 的子类型,那么 List[S] 就是 List[T] 的子类型,例如 List[String] 是 List[Object] 的子类型。
需要特别说明的是空列表的类型为 List[Nothing]:
scala>List()res1:List[Nothing] =List()
3. 构建List
所有 List 都由两个基本单元构成:Nil 和 ::(读作"cons")。即列表要么是空列表 (Nil),要么是由一个 head 加上一个 tail 组成,而 tail 又是一个 List。我们在上面使用的 List("hadoop", "spark", "storm") 最终也是被解释为 "hadoop"::"spark":: "storm"::Nil。
4. 模式匹配
Scala 支持展开列表以实现模式匹配。
如果只需要匹配部分内容,可以如下:
5. 列表的基本操作
5.1 常用方法
5.2 indices
indices 方法返回所有下标。
5.3 take & drop & splitAt
take:获取前 n 个元素;
drop:删除前 n 个元素;
splitAt:从第几个位置开始拆分。
5.4 flatten
flatten 接收一个由列表组成的列表,并将其进行扁平化操作,返回单个列表。
5.5 zip & unzip
对两个 List 执行 zip 操作结果如下,返回对应位置元素组成的元组的列表,unzip 则执行反向操作。
5.6 toString & mkString
toString 返回 List 的字符串表现形式。
如果想改变 List 的字符串表现形式,可以使用 mkString。mkString 有三个重载方法,方法定义如下:
使用示例如下:
5.7 iterator & toArray & copyToArray
iterator 方法返回的是迭代器,这和其他语言的使用是一样的。
toArray 和 toList 用于 List 和数组之间的互相转换。
copyToArray 将 List 中的元素拷贝到数组中指定位置。
6. 列表的高级操作
6.1 列表转换:map & flatMap & foreach
map 与 Java 8 函数式编程中的 map 类似,都是对 List 中每一个元素执行指定操作。
flatMap 与 map 类似,但如果 List 中的元素还是 List,则会对其进行 flatten 操作。
foreach 要求右侧的操作是一个返回值为 Unit 的函数,你也可以简单理解为执行一段没有返回值代码。
scala> list.map(_.toList)
res16: List[List[Char]] = List(List(h, a, d, o, o, p), List(s, p, a, r, k), List(s, t, o, r, m))
scala> list.flatMap(_.toList)
res17: List[Char] = List(h, a, d, o, o, p, s, p, a, r, k, s, t, o, r, m)
scala> var sum = 0
sum: Int = 0
scala> List(1, 2, 3, 4, 5) foreach (sum += _)
scala> sum
res19: Int = 15