java - Kotlin 的 Java 版本是否都有相同的限制?
问题描述
我目前正在学习来自 Java 的 Kotlin。在Java中,做
for(String s:stringList){
if(condition == true) stringList.remove(s);
}
不起作用,因为您只能使用 for each 读取数据。这也适用于 Kotlin 吗?
解决方案
这与 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
来填充您要保留的项目)。
如果您确实想就地修改可变集合,这是可能的,但您必须自己管理它,因为它本质上是危险的,并且系统无法保证您安全地进行操作。
推荐阅读
- javascript - Fabric.JS 与 Node.JS - 导出为 PNG/JPEG
- swift - 用于条码扫描的快速 Avcapture 会话不起作用
- google-colaboratory - 从介绍页面运行演示的 OpenAI Gym 错误
- amazon-web-services - AWS CloudFront 如何检测移动设备
- javascript - 如何在不使用 node.js 的情况下添加标准的反应应用程序
- tfs - 执行:执行(0,0):错误:未找到:python2
- apache-kafka - 使用用于 sqlite 的 jdbc 连接器使用 kafka 连接构建管道
- amazon-web-services - AWS S3 MV 致命错误:('读取操作超时',)
- docker - 如何在没有互联网访问的情况下使用掌舵图
- java - 为什么spring task:annotation-driven exception-handler没有在task:executor注解上配置