Kotlin 智能转换不转换字符串?去追!value.isNullOrBlank()

Kotlin 智能转换不转换字符串?去追!value.isNullOrBlank(),kotlin,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()) {

仅当对象具有所有字段时,我才想将其添加到列表中,并尝试以下代码:

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?
}
数据类响应(val-id:String,val-name:String)
val list=mutableListOf()
val id:字符串?=“测试id”
val名称:字符串?=“测试名称”
如果(!id.isNullOrBlank()和!name.isNullOrBlank()){
list.add(Response(id,name))//类型不匹配。必需字符串,找到字符串?
}
但是我得到了一个错误:
类型不匹配。必需的字符串,找到的字符串?

正确的(紧凑的)方法是什么?

我通常喜欢的替代方法,不涉及智能强制转换:

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

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

作为建议:始终尝试使用
&&
而不是按位
来评估您的条件。很少有理由使用按位
(有一些用例,但在大多数情况下,您只想对您的条件进行短路评估,如果其中一个函数中有一些复杂的计算/服务调用,则更是如此)

从我所看到和期望的情况来看,智能cast应该可以工作,因为
&&
已经可以工作了。我没有发现任何合适或匹配的问题,因此您可能希望对此进行验证


还请注意,智能转换应该可以工作,因为
isNullOrBlank
中定义了基本检查下面的值是否为
null
,因此它可能与合同的评估有关,和/或函数的内联和/或前者的某些内容与按位

相结合,进行按位and,use
&
@TIMCASTELIGNS,感谢它的工作。但是,在这种情况下,为什么Kotlin允许
作为布尔值之间的逻辑运算符?因为stdlib为布尔值定义了
公共中缀fun和(其他:布尔值):布尔值
instances@TimCastelijns我感到困惑——在javadoc中,它说:
在这个布尔值和[other]之间执行逻辑“and”运算一个。与
&&`运算符不同,此功能不执行短路评估。`。所以它应该是java single&operator的等价物,应该可以工作,但它不能工作?我认为这是Kotlin问题的一个很好的候选。应该可以。抱歉,看起来这不是真的,看看下面的评论question@tynn你可能想读<代码>isNullOrBlank中有一个契约,编译器可以执行智能转换。。。但只有在使用
&
时。。。在按位
上,它不起作用。。。老实说:你可能想读一些关于聪明演员的书。。。我发现你的代码比智能铸造的短路变体更难读懂…@Roland谢谢你的链接。我实际上错过了科特林的合同。我想代码的可读性是一个品味的问题。我觉得读书更好。请考虑从你的评论中提供答案。我已经为它增加了一个小资。