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谢谢你的链接。我实际上错过了科特林的合同。我想代码的可读性是一个品味的问题。我觉得读书更好。请考虑从你的评论中提供答案。我已经为它增加了一个小资。