在 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的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin HashMap包含使用数组的键

如何在 Kotlin 中检查泛型类型

Kotlin - 检查通用参数是否可选?

kotlin基础 空值检查

细说Kotlin工具函数及使用准则-转换函数map()过滤函数filter()聚合函数

Kotlin集合操作 ⑤ ( Map 集合 | 获取 Map 值 | Map 遍历 | 可变 Map 集合 )