我是Kotlin的新手,我想知道我是否可以做这样的事情。
我有一个对象类型为Person
的列表
Person
具有类似name, id
的属性,但可以为空。
所以我做了这样的事情:
return persons.filter {
it.name != null && it.id != null
}.map {
it.id to it.name
}.toMap()
我个人没有看到该错误,但是编译器不断告诉我应该返回一个非null的映射。
有什么办法可以使用lambdas函数使用filter和map吗?
答案 0 :(得分:3)
使用mapNotNull
组合enum
和VALUE_C
:
filter
将map
和persons.mapNotNull {
val id = it.id
val name = it.name
if (id != null && name != null) Pair(id, name) else null
}.toMap()
拉入局部变量应确保在id
中将它们推断为非空,但可能没有必要。
您的方法行不通的原因是name
仅返回Pair(id, name)
,无法说出“ persons.filter { ... }
的列表具有非空的List<Person>
和Person
”或在编译器内部进行表示。
答案 1 :(得分:3)
顺便说一句,您甚至可以摆脱if
中的mapNotNull
:
persons.mapNotNull {
val id = it.id ?: return@mapNotNull null
val name = it.name ?: return@mapNotNull null
id to name
}.toMap()
答案 2 :(得分:2)
也许您可以简单地更改
.map {
it.id to it.name
}
进入
.map {
it.id!! to it.name!!
}
后缀!!
会将String?
转换为String
,如果类型为String?
的值是null
,则抛出异常。是正确的,因为先前应用了过滤器。
!!
的使用应仅限于您负责明确声明该值不能为null的情况:对编译器来说,即使类型为{{1 }--应该谨慎使用imho。
编译器无法根据传递给String
的谓词来推断从String?
到String?
的类型域限制,但是您可以,所以我认为String
的使用可能是一种有价值的方法...