Kotlin:就地保留、替换或删除每个地图条目

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()风格的多合一解决方案,仅适用于所有条目。

Far*_*tab 4

在函数世界中,不变性是一个基本原则。所以就地修改不太方便。

但如果您更喜欢就地方法,可能的选项是retainAllremoveAll来过滤项目。对于就地替换,您需要迭代集合。您可以使用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)