映射可选参数时,RxKotlin出现意外的NullPointException

时间:2019-11-28 14:58:57

标签: kotlin rx-java2 rx-kotlin2

首先,我具有以下Moshi json。

@JsonClass(generateAdapter = true)
data class OrderDetails(
    @Json(name = "_id") val id: Int,
    @Json(name = "status") val status: String,
    @Json(name = "tableNo") val tableNo: Int,
    @Json(name = "serverId") val serverId: Int?,
    @Json(name = "items") val orderItems: List<OrderDetailsItem>
)

所有这些字段均应包含serverId以外的数据。 这些数据是从服务器上获取的,我可以在其中允许用户选择订单。

onSeletedOrder
   .map { it.orderDetails.serverId } //blows up here apparently.
   .filterNotNull() //have tried this but it doesn't matter.
   .flatMap { findServerBy(it) }
   .map { "${it.firstname} ${it.lastname}" }

当我映射到上面的serverId时,我被NPE炸了。 有趣的是,映射(即使它是可选的)之后也会进行不安全的转换。 我希望它在地图后保持可选性。 我假设这是由于向后桥接到RxJava。 好奇是否有人对此有进一步的解释。

3 个答案:

答案 0 :(得分:1)

RxJava不允许流内包含null。理想情况下,您应该在项目进入流之前执行此过滤器,但是如果您不能执行此解决方法,则可以避免的是使用空字符串代替null。

onSeletedOrder
   .map { it.orderDetails.serverId.orEmpty() }
   .filter { it.isNotEmpty() }
   .flatMap { findServerBy(it) }
   .map { "${it.firstname} ${it.lastname}" }

答案 1 :(得分:0)

对于“ map,但不包括某些元素”,RxJava具有flatMapMaybeObservable以外的其他类型也可以具有相应的返回类型):

// helper
fun <T> T?.toMaybe(): Maybe<T> = if (this != null) Maybe.just(this) else Maybe.empty<T>

onSeletedOrder
   .flatMapMaybe { it.orderDetails.serverId.toMaybe() }
   .flatMap { findServerBy(it) }
   .map { "${it.firstname} ${it.lastname}" }

答案 2 :(得分:0)

最好的方法是使用可选数据格式化数据类。

@JsonClass(generateAdapter = true)
data class OrderDetails(
    @Json(name = "_id") val id: Int? = 0,
    @Json(name = "status") val status: String? = "Not active",
    @Json(name = "tableNo") val tableNo: Int? = 0,
    @Json(name = "serverId") val serverId: Int? = 0,
    @Json(name = "items") val orderItems: List<OrderDetailsItem>? = listOf()
)

您不会收到任何NPE