scala中的List

67 阅读2分钟

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)  // 14: 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 推荐优先使用不可变集合,仅在性能需求时用可变集合。