首页 > 解决方案 > Kotlin 的 Java 版本是否都有相同的限制?

问题描述

我目前正在学习来自 Java 的 Kotlin。在Java中,做

for(String s:stringList){
   if(condition == true) stringList.remove(s);
}

不起作用,因为您只能使用 for each 读取数据。这也适用于 Kotlin 吗?

标签: javakotlinforeach

解决方案


这与 Java 中的限制相同 - 当您迭代集合时,您只能通过Iterator'remove()方法修改它

从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用 next() 时只能调用一次此方法。如果在迭代过程中以除调用此方法之外的任何方式修改了基础集合,则迭代器的行为是未指定的

Kotlin 有它自己的等价物(记住 Kotlin 使用可变和不可变列表的概念,所以你只能用 a 来做到这一点MutableList

foreach/ 增强结构的问题for在于它不会公开Iterator您需要调用remove()的内容,并且不允许您调用remove()集合本身。和 Kotlin 一样 - 所以你的选择基本上是

  • 使用for/ forEach(但不能修改集合)
  • 调用集合的iterator()方法并自己迭代它(现在你可以调用remove()它,但有我引用的限制)
  • 避免可变性并产生一个新的集合

最后一个是在 Kotlin 中鼓励你做的事情——不要修改集合,而是尝试使用不可变的集合并将它们转换为新的集合:

stringList.filterNot { condition }

如果您熟悉所有集合函数(是的,其中有很多),您就会了解将 A 转换为 B 的方法,以及可以帮助您完成的便捷函数(filterTo例如让您提供一个MutableList来填充您要保留的项目)。

如果您确实想就地修改可变集合,这是可能的,但您必须自己管理它,因为它本质上是危险的,并且系统无法保证您安全地进行操作。


推荐阅读