在Java语言中使用RxJava2时,我的优点是map()
可以自动过滤发出的空值。然而,对于Kotlin中的可空类型,我最终做了这样的事情:
val loadConferencesSingle = service.getConferences()
.map { it.conferences ?: listOf<Conference>() }
本例中的service.getConferences()
调用是一个发出ConferecesResponse
的函数,如下所示
data class ConferencesResponse(val conferences: List<Conference?>? = null)
因此,在发出的完整会议列表为空的情况下,我最终使用Elvis操作符发出一个空列表。在map
中发出null是不可能的。
有人知道如何用Kotlin在RxJava中更好地处理可空类型吗?我已经喜欢这个解决方案和它的简洁,但我感觉还有更好的方法来处理这个问题。
发布于 2017-07-18 08:36:15
在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() }
..and等等。
发布于 2017-07-18 08:11:18
这完全取决于什么被认为是有效的结果。缺少conferences
是否意味着没有呢?那么空列表就是一个合适的替代品。如果这不是故意要发生的,那么抛出异常可能是合适的响应。
此外,抛出异常也适用于elvis运算符:it.conferences ?: throw IllegalStateException("Why is it null?")
https://stackoverflow.com/questions/45160583
复制