对象属性的 Kotlin filterNotNull

Kotlin filterNotNull for object properties

我有以下(简化的)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.venue 不能在 .map 调用中成为 null

如果事件可以为空,我可以写 events.filterNotNull().name 或其他东西,编译器不会抱怨。有什么方法可以对可空对象 属性 而不是可空对象执行相同的操作?

感谢您的宝贵时间

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

(甚至不可能将 "a collection of Event where Event.venue is not null" 的想法表达为 Kotlin 类型,更不用说推断 map 的接收者将具有该类型。)

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

认为您接下来可以做的事情:

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