Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin迭代集合并将某个值映射到新映射_Kotlin - Fatal编程技术网

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