我有以下map对象:
var myStringMap = mapOf(10 to mutableListOf<String>(),11 to mutableListOf<String>(), 12 to mutableListOf<String>())
我想从一个源文件追加到相应的密钥,如下所示:
myStringMap.keys.forEach { key ->
getStringFromSource(source, user).let {
if (it != null) {
myStringMap[key]!!.add(it)
}
}
}
问题是我需要添加!!否则,编辑器将抱怨对可空对象的安全调用。为什么?
之后,当我想过滤其值为空的键时,只要GetBytes具有mutableelist,我就会出现输入错误?.
myStringMap.filter { (_: Int, value) -> value.isNotEmpty() }.let {
it.keys.forEach { key ->
val bytes = GetBytes(it[key])
allBytes.add(bytes)
}
}
为什么?,context应该是Map<Int,MutableList>?也许我应该把mutableList转换成列表?
为什么it[key]
仍然返回一个可空的类型,即使当你从它的keys
集合传递的东西?因为这是Map
的get
方法声明的返回值。它不依赖于你传入的值。
values
,而不是keys
。
如果getStringFromSource
有副作用,例如每次调用它都会返回一个不同的字符串,你可以这样做:
myStringMap.values.forEach { value ->
getStringFromSource(source, user)?.let { value.add(it) }
}
如果getStringFromSource
没有副作用,可以先调用它:
getStringFromSource(source, user)?.let { string ->
myStringMap.values.forEach { it.add(string) }
}
如果你实际上指的是getStringFromSource(source, key)
,那么你应该在entries
上操作,它给你提供了键和值:
myStringMap.entries.forEach { (key, value) ->
getStringFromSource(source, key)?.let { value.add(it) }
}
这也适用于第二种情况。似乎您正在尝试对每个值做一些事情,因此只需访问values
,而不是keys
。
myStringMap.filterValues(List<String>::isNotEmpty).values.forEach {
allBytes.add(GetBytes(it))
}
使用您需要的过滤器:
filter
first
- …
和它们let
示例:
mutableList。首先{它。isSelected == false}。让{这个?isSelected = true}