首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Kotlin在RxJava中处理可空类型

使用Kotlin在RxJava中处理可空类型
EN

Stack Overflow用户
提问于 2017-07-18 15:48:37
回答 2查看 2.5K关注 0票数 4

在Java语言中使用RxJava2时,我的优点是map()可以自动过滤发出的空值。然而,对于Kotlin中的可空类型,我最终做了这样的事情:

代码语言:javascript
运行
复制
val loadConferencesSingle = service.getConferences()
        .map { it.conferences ?: listOf<Conference>() }

本例中的service.getConferences()调用是一个发出ConferecesResponse的函数,如下所示

代码语言:javascript
运行
复制
data class ConferencesResponse(val conferences: List<Conference?>? = null)

因此,在发出的完整会议列表为空的情况下,我最终使用Elvis操作符发出一个空列表。在map中发出null是不可能的。

有人知道如何用Kotlin在RxJava中更好地处理可空类型吗?我已经喜欢这个解决方案和它的简洁,但我感觉还有更好的方法来处理这个问题。

EN

回答 2

Stack Overflow用户

发布于 2017-07-18 16:36:15

在Kotlin中,Optional是一个完全有效的类型。没有值也是一个结果。您可以创建一个简单的数据类和函数,如下所示:

代码语言:javascript
运行
复制
data class Optional<T>(val value: T?)
fun <T> T?.carry() = Optional(this)

或者,您可以创建一些简单的扩展函数来简化后续操作符:

代码语言:javascript
运行
复制
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等等。

票数 8
EN

Stack Overflow用户

发布于 2017-07-18 16:11:18

这完全取决于什么被认为是有效的结果。缺少conferences是否意味着没有呢?那么空列表就是一个合适的替代品。如果这不是故意要发生的,那么抛出异常可能是合适的响应。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45160583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档