Cyb*_*ran 7 java dictionary functional-programming kotlin
我LinkedHashMap在 Kotlin 中有一个可变映射(具体来说是一个)。对于每个地图条目,我想有条件地执行以下三个操作之一:
在旧 Java 中,我可能会为此目的(使用或相应地)使用Iterator地图上的。但是,我想知道 Kotlin 中是否存在一种更优雅、更实用的方法来执行相同的操作(即,将 lambda 就地应用于每个条目,类似于 using ,但还可以删除条目)。entrySet()Iterator.remove()Entry.setValue()replaceAll()
在 Kotlin 中,以下组合replaceAll()和retainAll()做同样的事情:
val map = LinkedHashMap<String,Int>(mapOf("a" to 1, "b" to 2, "c" to 3))
map.replaceAll { key, value ->
if(key.startsWith("a")) {
value * 2
} else {
value
}
}
map.entries.retainAll { entry ->
entry.key.startsWith("a") || entry.key.startsWith("b")
}
Run Code Online (Sandbox Code Playgroud)
但是,这会重复映射两次,并且需要拆分谓词/转换。我更喜欢一种compute()风格的多合一解决方案,仅适用于所有条目。
在函数世界中,不变性是一个基本原则。所以就地修改不太方便。
但如果您更喜欢就地方法,可能的选项是retainAll或removeAll来过滤项目。对于就地替换,您需要迭代集合。您可以使用forEach进行就地修改:
data class User(var name: String)
val users = mutableListOf( User("John"), User("Alice"), User("Bob") )
users.run {
removeAll { it.name == "Alice" }
forEach { it.name = "Mr. ${it.name}"}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4675 次 |
| 最近记录: |