用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?")