我有个密码:
val d = Single
.zip<List<X>, Optional<Y>, DataContent>(
xSingle,
YSingle,
BiFunction { x, y ->
val b = if (y.isPresent()) {
y.get()
} else {
null
}
return@BiFunction DataContent(x, b)
})
.subscribe({ data ->
...
}, { t ->
...
})我听说过,使用Optional检查空值(如示例所示)是错误的做法。这是真的吗?为什么?有人能用RxJava2展示另一种选择吗?
发布于 2018-05-20 00:21:02
一般来说,Optional有一组受限的用例,并且有被过度使用的危险。您可以参考Java作者Brian的this answer来理解这些(重点是添加的):
但是我们在添加这个java.util.Optional特性时确实有一个明确的意图,而且它不是一般的目的我们的目的是为库方法返回类型提供一种有限的机制,在这种机制中,需要有一种清晰的方法来表示“无结果”,而使用null则极有可能导致错误。 例如,您可能不应该将其用于返回结果数组或结果列表的东西,而应该返回空数组或列表。您几乎不应该将其用作某物的字段或方法参数.
在最初发布的示例中,Optional<Y>被用作方法参数,因此这与Java最佳实践背道而驰。此外,Maybe在RxJava中是惯用的。
假设您有如下内容:
class X
class Y
data class DataContent constructor(val listOfX: List<X>, val y: Y)您可以编写这样的函数,它似乎适合您的用例:
fun zipToDataContent(maybeListOfX: Maybe<List<X>>, maybeY: Maybe<Y>): Maybe<DataContent> =
Maybe.zip<List<X>, Y, DataContent>(
maybeListOfX,
maybeY,
BiFunction { listOfX, y -> DataContent(listOfX, y) })测试:
@Test
fun testZipToDataContentWithRealY() {
val x = X()
val y = Y()
val maybeListOfX = Maybe.just(listOf(x))
val maybeY = Maybe.just(y)
zipToDataContent(maybeListOfX, maybeY).test()
.assertOf {
Maybe.just(DataContent(listOf(x), y))
}
}
@Test
fun testZipToDataContentWithEmptyY() {
val x = X()
val maybeListOfX = Maybe.just(listOf(x))
val maybeY = Maybe.empty<Y>()
zipToDataContent(maybeListOfX, maybeY).test()
.assertOf {
Maybe.empty<DataContent>()
}
}https://stackoverflow.com/questions/50384763
复制相似问题