用Kotlin在RxJava中处理可空类型

在Java中使用RxJava2时,我有map()过滤自动发出空值的好处。 然而,Kotlin中的可空类型最终会做这样的事情:

 val loadConferencesSingle = service.getConferences() .map { it.conferences ?: listOf<Conference>() } 

在这种情况下调用service.getConferences()是一个单一的发射ConferecesResponse看起来像

 data class ConferencesResponse(val conferences: List<Conference?>? = null) 

因此,如果完整的会议发布清单是空的,我最终使用猫王操作员发出一个空列表。 在map发射null是不可能的。

有谁有线索,如何用Kotlin在RxJava中更好地处理可空类型? 我已经喜欢这个解决方案和它的简洁,但是我觉得有更好的方法来处理这个问题。

在Kotlin中, Optional是一个完全有效的类型。 缺乏价值也是一个结果 。 你可以像这样创建一个简单的数据类和函数:

 data class Optional<T>(val value: T?) fun <T> T?.carry() = Optional(this) 

或者,您可以创建一些简单的扩展函数,以使后续操作更加简单:

 fun <T, R> Observable<Optional<T>>.mapNullable(mapper: (T?) -> R?) : Observable<Optional<R>> = map { mapper(it.value).carry() } fun <T, R> Observable<Optional<T>>.mapFromNullable(mapper: (T?) -> R) : Observable<R> = map { mapper(it.value).carry() } 

..等等。

完全取决于什么被认为是有效的结果。 缺乏conferences意味着没有? 那么空的清单是一个合适的替代品。 如果不是要发生,那么抛出异常可能是适当的回应。

另外抛出异常也适用于elvis运算符: it.conferences ?: throw IllegalStateException("Why is it null?")