Kotlin List 不包含 add?寻找缺失的方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么 Kotlin “拿走了” 我们的 add、remove 和 put?一次性彻底搞懂

\n\n

如果你曾经用 Java 写过代码,然后转向 Kotlin,那么你肯定遇到过这种小小的困惑时刻。你创建了一个 List,想往里面添加一个元素——写下 .add(),但开发环境却标红了。或者你试图通过 .put() 向 Map 中放入一个值——结果又报错了。

\n\n

熟悉吗?当然!Stack Overflow 上的问题 “Kotlin 的 List 缺少 “add”、“remove”,Map 缺少 “put” 等?” 已经积累了数千次浏览和几十条评论。这确实是初学者的绊脚石,即使是经验丰富的开发人员有时也会想:“我习惯的那些方法去哪了?”

\n\n

在这篇文章中,我们不仅会回答这个问题。我们还会展示 Kotlin 的哲学如何将这个“缺陷”变成你的主要优势。你将了解 2025 年集合操作的最佳实践,学会选择正确的集合类型,并且不再混淆 listOf 和 mutableListOf。开始吧!

\n\n

关键是什么?不可变性是一种生活方式

\n\n

首先需要理解的是:Kotlin 从设计之初就鼓励编写安全且可预测的代码。其中一个主要原则就是默认不可变性(immutability)。

\n\n

在 Java 中,你有一个接口 List,它总是包含 add()、remove()、set() 等方法。即使你通过 List.of()(Java 9+)创建列表,你仍然可以访问这些方法——它们只是在运行时抛出异常。这既不方便也不安全。

\n\n

Kotlin 走了另一条路。它将集合分为两种类型:

\n\n
    \n
  • 不可变(只读): List、Set、Map——它们没有修改内容的方法。
  • \n
  • 可变(mutable): MutableList、MutableSet、MutableMap——它们拥有所有熟悉的 add、remove、put 方法。
  • \n
\n\n

正因如此,listOf(1, 2, 3) 没有 .add() 方法。它返回一个不可变列表。而 mutableListOf(1, 2, 3) 返回一个可变列表,它拥有 .add() 方法。

\n\n

听起来合理吗?让我们看看代码。

\n\n

示例:哪些可以工作,哪些不行

\n\n

这是一个经典的让初学者困惑的情况:

\n\n
// ❌ 错误!List 没有 add()\nval fruits = listOf("apple", "banana")\nfruits.add("orange") // 编译错误\n\n// ✅ 正确:使用 MutableList\nval mutableFruits = mutableListOf("apple", "banana")\nmutableFruits.add("orange") // 现在可以工作了!\nprintln(mutableFruits) // [apple, banana, orange]\n
\n\n

Map 也是同样的情况:

\n\n
// ❌ 错误!Map 没有 put()\nval capitals = mapOf("Russia" to "Moscow", "France" to "Paris")\ncapitals.put("Germany", "Berlin") // 编译错误\n\n// ✅ 正确:使用 MutableMap\nval mutableCapitals = mutableMapOf("Russia" to "Moscow", "France" to "Paris")\nmutableCapitals.put("Germany", "Berlin")\n// 或者更简洁的方式:\nmutableCapitals["Germany"] = "Berlin"\nprintln(mutableCapitals) // {Russia=Moscow, France=Paris, Germany=Berlin}\n
\n\n

请注意:对于 MutableMap,你可以使用操作符方括号 []——这本质上就是 put()。非常方便!

\n\n

但为什么?Kotlin 为什么要让生活更复杂?

\n\n

乍一看,这似乎是额外的麻烦。为什么要记住两种集合类型?实际上,这是一个天才的设计。这里有三个主要原因:

\n\n

1. 类型层面的安全性

\n

现在编译器会确保你不会意外修改一个本应保持不变的列表。

博客

书籍推荐