我在Kotlin中有一个可变Map(具体来说是LinkedHashMap
),对于每个Map条目,我想有条件地执行以下三个操作之一:
- 按原样保留条目
- 替换条目的值
- 删除条目
在旧的Java中,我可能会使用Iterator
而不是map的entrySet()
来实现这个目的(相应地使用Iterator.remove()
或Entry.setValue()
),但是,我想知道Kotlin中是否存在一种更优雅的、函数式的方法来实现同样的目的(即将lambda应用于每个条目,类似于使用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")
}
然而,这会迭代Map两次,并且需要拆分 predicate /转换。我更喜欢compute()
风格的一体化解决方案,只针对所有条目。
4条答案
按热度按时间pdsfdshx1#
以下是如何在单个表达式中执行所有运算的示例:
filter{}
,我们只保留符合特定条件的元素,如下所示:值〉= 200。此过滤器的结果是新贴图。toMap()
,我们将生成的集合转换为一个新的Map。c90pui9n2#
在函数世界中,不变性是一个基本原则,因此原地修改是不方便的。
但是如果你更喜欢原地替换的方法,可以选择
retainAll
或removeAll
来过滤项,对于原地替换,你需要迭代集合,你可以使用forEach
来做原地修改:biswetbf3#
例如,你可以这样写
1tuwyuhd4#
这个版本已经准备好了(类似于你用java写的东西),但是没有使用函数方法