在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
中发出空值。
有没有人知道如何使用Kotlin在RxJava中更好地处理可空类型?我已经喜欢这个解决方案及其简洁性,但我觉得有更好的方法可以解决这个问题。
答案 0 :(得分:7)
Optional
在Kotlin中是完全有效的类型。 值的缺席 也是的结果。您可以创建一个简单的数据类和函数,如下所示:
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() }
..等等。
答案 1 :(得分:1)
完全取决于什么是有效的结果。缺少conferences
是否意味着没有?然后空列表是一个合适的替代品。如果不是这样,那么抛出异常可能是适当的反应。
此外,抛出异常也适用于elvis运算符:it.conferences ?: throw IllegalStateException("Why is it null?")