仅当它们具有所有字段时,我才想添加到列表对象,然后尝试以下代码:
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?
正确(紧凑)的方法是什么?
答案 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))
在这里,您在获取值时会验证该值,如果无法使用,则会中止。