Kotlin filterNotNull用于对象属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin filterNotNull用于对象属性相关的知识,希望对你有一定的参考价值。

我有以下(简化)kotlin代码:

data class Event(val name: String, val venue: Venue?)

data class Venue(val lat: Double, val lng: Double)

...

return events
        .filter { it.venue != null }
        .map { doSomething(it.venue.lat, it.venue.lng)

代码无法使用错误Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Venue?进行编译

我理解这意味着什么,但我不明白为什么编译器无法弄清楚it.venuenull调用中不能成为.map

如果事件可以为空,我可以写events.filterNotNull().name或其他东西,编译器不会抱怨。是否有任何方法可以为可空对象属性而不是可空对象做同样的事情?

谢谢你的时间

答案

不,这不可能,无论是在当前版本的Kotlin还是目前正在考虑的任何潜在增强功能。 Kotlin编译器不够聪明,无法理解filter函数的语义,并且知道在传递给该函数的lambda中执行的检查将影响不同lambda中的可能类型。

(甚至没有可能将“事件的集合,其中Event.venue不为空”表示为Kotlin类型,更不用说推断map的接收器将具有该类型。)

另一答案

如果它会检查所有类似的情况,你的编译时间将超长。

以为你可以做下一个:

events
    .map { it.venue }
    .filterNotNull()
    .map { doSomething(it.lat, it.lng)

以上是关于Kotlin filterNotNull用于对象属性的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 对象表达式和对象声明

Kotlin 六 对象表达式和对象声明

在 Kotlin 中使用对象内部的属性初始化组件

将对象缓存到android(kotlin)中的文件

Kotlin object 总结

Kotlin学习之类与对象继承与构造函数