在 Kotlin 的 map 函数中检查 null
Posted
技术标签:
【中文标题】在 Kotlin 的 map 函数中检查 null【英文标题】:Check for null in map function in Kotlin 【发布时间】:2018-02-08 17:35:52 【问题描述】:我是 Kotlin 的新手,我想根据另一个对象 (fmpProduct) 映射一个对象 (ProductVisibility)。某些对象无法转换,因此我需要在某些情况下跳过它们。
我想知道是否有比我使用过滤器和“!!”更好的方法来做到这一点我觉得它被黑客入侵了。我错过了什么吗?
val newCSProductVisibility = fmpProducts
.filter parentIdGroupedByCode.containsKey(it.id)
.filter ProductType.fromCode(it.type) != null //voir si on accumule les erreus dans une variable à montrer
.map
val type = ProductType.fromCode(it.type)!! //Null already filtered
val userGroupIds = type.productAvailabilityUserGroup.map it.id .joinToString(",")
val b2bGroupIds = type.b2bUserGroup.map it.id .joinToString ","
val b2bDescHide = !type.b2bUserGroup.isEmpty()
val parentId = parentIdGroupedByCode[it.id]!! //Null already filtered
CSProductDao.ProductVisibility(parentId, userGroupIds, b2bGroupIds, b2bDescHide)
编辑:更新地图访问,如评论建议
【问题讨论】:
要读取地图值,您可能应该使用数组注释:parentIdGroupedByCode[it.id] 我更新了地图以访问它,就像你说的谢谢,但它仍然可以为空 【参考方案1】:使用mapNotNull()
避免filter()
s 并在mapNotNull()
块中执行所有操作,然后自动转换为non-null
类型。
示例:
fun f()
val list = listOf<MyClass>()
val v = list.mapNotNull
if (it.type == null) return@mapNotNull null
val type = productTypeFromCode(it.type)
if (type == null) return@mapNotNull null
else MyClass2(type) // type is automatically casted to type!! here
fun productTypeFromCode(code: String): String?
return null
class MyClass(val type: String?, val id: String)
class MyClass2(val type: String)
【讨论】:
我不知道 mapNotNull。但是什么是 return@mapNotNull null。当我尝试您的代码时它起作用了,但是当我尝试使用我的代码时,我不得不将它添加到我返回的对象中,因为有一个我不知道它来自哪里的转换错误。 return@mapNotNull CSProductDao.ProductVisibility(parentId, userGroupIds, b2bGroupIds, b2bDescHide) 我在@mapNotNull 上找不到文档,我的谷歌搜索越来越差:( 我找到了答案。这是一个返回标签,很有意义:kotlinlang.org/docs/reference/returns.html#return-at-labels以上是关于在 Kotlin 的 map 函数中检查 null的主要内容,如果未能解决你的问题,请参考以下文章