1

首先,我有以下 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。好奇是否有人对这是为什么有进一步的解释。

4

3 回答 3

1

RxJava 不允许在流中使用空值。理想情况下,您应该在项目进入流之前执行此过滤器,但如果您不能这样做,您可以使用一个空字符串来代替 null。

onSeletedOrder
   .map { it.orderDetails.serverId.orEmpty() }
   .filter { it.isNotEmpty() }
   .flatMap { findServerBy(it) }
   .map { "${it.firstname} ${it.lastname}" }
于 2019-11-29T06:52:26.517 回答
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

于 2019-11-29T07:44:37.510 回答
0

对于 " map, but exclude some elements",RxJava 有flatMapMaybe(其他类型Observable也可以有相应的返回类型):

// 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}" }
于 2019-11-29T07:39:40.503 回答