1. List 的定义
在 Scala 中,List是不可变的线性序列,属于scala.collection.immutable包,底层基于链表实现,每个元素包含自身值和指向下一个元素的引用(Nil 表示空列表)。
- 不可变 List:一旦创建,元素和长度无法修改(默认导入
scala.collection.immutable.List)。 - 可变 List:对应
scala.collection.mutable.ListBuffer(或MutableList),支持动态增删改。
2. 可变 List(ListBuffer)的常见用法
Scala 中可变 List通常使用ListBuffer(更高效),需导入scala.collection.mutable.ListBuffer。
(1)创建
scala
import scala.collection.mutable.ListBuffer
// 空ListBuffer
val listBuffer1 = ListBuffer[Int]()
val listBuffer2 = new ListBuffer[String]()
// 带初始元素
val listBuffer3 = ListBuffer(1, 2, 3)
val listBuffer4 = ListBuffer("a", "b", "c")
(2)添加元素
scala
// 尾部添加
listBuffer3 += 4 // 结果: ListBuffer(1, 2, 3, 4)
listBuffer3.append(5) // 结果: ListBuffer(1, 2, 3, 4, 5)
// 头部添加
listBuffer3.prepend(0) // 结果: ListBuffer(0, 1, 2, 3, 4, 5)
// 批量添加
listBuffer3 ++= List(6, 7) // 结果: ListBuffer(0, 1, 2, 3, 4, 5, 6, 7)
(3)修改元素
scala
listBuffer3(0) = -1 // 索引0的元素改为-1,结果: ListBuffer(-1, 1, 2, 3, 4, 5, 6, 7)
(4)删除元素
scala
// 按索引删除
listBuffer3.remove(0) // 删除索引0的元素,结果: ListBuffer(1, 2, 3, 4, 5, 6, 7)
// 按值删除(第一个匹配项)
listBuffer3 -= 7 // 结果: ListBuffer(1, 2, 3, 4, 5, 6)
// 批量删除
listBuffer3 --= List(5, 6) // 结果: ListBuffer(1, 2, 3, 4)
(5)转换为不可变 List
scala
val immutableList = listBuffer3.toList // 转为不可变List
(6)遍历
scala
for (elem <- listBuffer3) println(elem)
listBuffer3.foreach(println)
3. 不可变 List 的常见用法
Scala 默认的List是不可变的(scala.collection.immutable.List),所有操作返回新 List,原 List 不变。
(1)创建
scala
// 空List
val emptyList = Nil
val emptyList2 = List()
// 带初始元素
val list1 = List(1, 2, 3)
val list2 = "a" :: "b" :: "c" :: Nil // 用::构建(右结合)
val list3 = List.range(1, 5) // 1到4: List(1, 2, 3, 4)
(2)访问元素
scala
list1.head // 第一个元素: 1
list1.tail // 除第一个外的元素: List(2, 3)
list1(1) // 索引1的元素: 2(注意:链表随机访问效率低)
(3)添加元素(返回新 List)
scala
// 头部添加(::)
val newList1 = 0 :: list1 // List(0, 1, 2, 3)
// 尾部添加(:+)
val newList2 = list1 :+ 4 // List(1, 2, 3, 4)
// 拼接List(++)
val newList3 = list1 ++ List(4, 5) // List(1, 2, 3, 4, 5)
(4)删除 / 过滤元素(返回新 List)
scala
// 过滤
val filteredList = list1.filter(_ > 1) // List(2, 3)
// 丢弃前n个元素
val dropList = list1.drop(1) // List(2, 3)
// 取前n个元素
val takeList = list1.take(2) // List(1, 2)
(5)遍历与转换
scala
// 遍历
list1.foreach(println)
// 映射(map)
val mappedList = list1.map(_ * 2) // List(2, 4, 6)
// 扁平化(flatMap)
val nestedList = List(List(1,2), List(3,4))
val flatList = nestedList.flatMap(_.map(_ * 2)) // List(2,4,6,8)
(6)常用操作
scala
list1.isEmpty // 判断是否为空: false
list1.length // 长度: 3
list1.reverse // 反转: List(3, 2, 1)
list1.sum // 求和: 6
list1.max // 最大值: 3
总结
- 不可变 List:默认使用,线程安全,操作返回新实例,适合只读场景。
- 可变 ListBuffer:适合频繁增删改的场景,需显式导入,最后可转为不可变 List。Scala 推荐优先使用不可变集合,仅在性能需求时用可变集合。