Kotlin迭代集合并将某个值映射到新映射
我有一张藏品地图。我需要从那里得到一份身份证清单Kotlin迭代集合并将某个值映射到新映射,kotlin,Kotlin,我有一张藏品地图。我需要从那里得到一份身份证清单 val m1 = mapOf("id" to 1, "name" to "Alice") val m2 = mapOf("id" to 2, "name" to "Bob") val m3 = mapOf("id" to 3, "name" to "Tom") val
val m1 = mapOf("id" to 1, "name" to "Alice")
val m2 = mapOf("id" to 2, "name" to "Bob")
val m3 = mapOf("id" to 3, "name" to "Tom")
val nameList = listOf(m1, m2, m3)
结果应该是
[1,2,3]
首先,我认为如果可以的话,应该使用类而不是映射来存储这样的异构数据。因此,您可以使用以下内容代替地图:
数据类人员(val id:Int,val name:String)
val m1=个人(id=1,name=“Alice”)
val m2=个人(id=2,name=“Bob”)
val m3=个人(id=3,name=“Tom”)
val list=listOf(m1、m2、m3)
val idsList=list.map{it.id}//无需错误处理,依赖于类型系统
现在,如果你真的想使用这样的地图,你有几个选择 如果您确定
id
键将出现并且其值将为Int
,则可以使用以下选项:
nameList.map{it[“id”]as Int}
如果其中一个映射中不存在id
,此操作将失败,如果它不是Int
,此操作将失败
通常,您应该确保地图在创建时与合同匹配,而不是在访问此类信息时。
但是,如果出于某种原因需要在此处处理错误,可以使用以下方法:
nameList.map{
(it.getValue(“id”)作为?Int)?:错误(“'id'不是Int”)
}
getValue
在出现NoSuchElementException
的缺失键时失败,而error()
调用在出现IllegalStateException
时失败。您还可以使用throw
或require()
使用其他类型的异常
如果只想忽略没有有效整数id的条目,可以使用以下方法:
nameList.mapNotNull{it[“id”]as?Int}
如果要忽略没有id的条目,但在具有非整数id的条目上失败,可以使用以下方法:
nameList.mapNotNull{map->
映射[“id”]?。让{id->
(id为?Int)?:错误(“'id'不是Int”)
}
}
最后两个示例依赖于mapNotNull
,如果元素的映射值为null
,则会过滤掉元素。假设您想要的是示例中的列表,而不是标题中的映射,我会这样做:
val result = nameList.map {
it.getValue("id").also { id ->
require(id is Int) { "id must be an Int" }
} as Int
}
这样做的优点是可以干净地处理以下错误:
id
键缺失:NoTouchElementException:映射中缺少键id
id
值不是Int
:IllegalArgumentException:id必须是Int
标题表示您需要地图,但示例结果是列表。您想要哪个?映射的Int
和String
值之间的关系是什么?为什么需要将它们混合在同一个映射中,这意味着不能利用泛型?正如Adam指出的,这可能不是最适合您的情况的数据结构。 您是否考虑过使用名为id
和name
的字段来创建数据类,而不是映射? 然后,您可以使用nameList.map{it.id}
获取它们的所有id,所有类型都可以正常工作。值得一提的是,如果没有值,这将抛出NullPointerException
,如果值不是Int
@AdamMillerchip yes,我相信你是对的,应该提到它。我添加了更多的版本,这取决于什么被认为是错误与否。这与之前的两行回答有很大的不同,这就是我在电话和电脑上回答的区别:D