聪明的演员不铸造弦乐吗?到!value.isNullOrBlank()之后的字符串

时间:2018-12-18 08:50:35

标签: kotlin

仅当它们具有所有字段时,我才想添加到列表对象,然后尝试以下代码:

data class Response(val id: String, val name: String)
val list = mutableListOf<Response>()

val id : String? = "test_id"
val name : String? = "test_name"

if (!id.isNullOrBlank() and !name.isNullOrBlank()) {
    list.add(Response(id, name)) // Type mismatch. Required String, Found String?
}

但是我收到一个错误:Type mismatch. Required String, Found String? 正确(紧凑)的方法是什么?

2 个答案:

答案 0 :(得分:4)

建议:始终尝试使用&&而不是按位and来评估您的状况。几乎没有任何理由使用按位and(有一些用例,但是在大多数情况下,您只想对条件进行短路评估,如果有一些复杂的计算,就更是如此/其中一个功能调用服务。)

根据我的见解,并期望智能转换能够正常工作,甚至更有效,因为&&已经有效。我没有找到任何合适或匹配的问题,因此您可能需要open a new ticket

还请注意,由于isNullOrBlank中定义的Kotlin contract可以进行智能转换,因此基本上检查下面的值是否为null,因此它可能与合同评估有关,和/或函数的内联和/或前者与按位and的组合。

答案 1 :(得分:0)

我通常喜欢做的另一种方法,不涉及智能转换:

val id : String = getId()?.takeIf { it.isNotBlank() } ?: return
val name : String = getName()?.takeIf { it.isNotBlank() } ?: return
list.add(Response(id, name))

在这里,您在获取值时会验证该值,如果无法使用,则会中止。