筛选具有mutableelist值的Map



我有以下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集合传递的东西?因为这是Mapget方法声明的返回值。它不依赖于你传入的值。

这里要意识到的关键是,您正在尝试对映射的每个做一些事情,它们都映射到一个键。您正在尝试向每个值添加一个元素,这些值是列表。你应该访问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}

相关内容

  • 没有找到相关文章

最新更新