首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8“可选”的不良实践?

Java 8“可选”的不良实践?
EN

Stack Overflow用户
提问于 2018-05-17 06:31:50
回答 1查看 4.5K关注 0票数 2

我有个密码:

代码语言:javascript
复制
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展示另一种选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-20 00:21:02

一般来说,Optional有一组受限的用例,并且有被过度使用的危险。您可以参考Java作者Brian的this answer来理解这些(重点是添加的):

但是我们在添加这个java.util.Optional特性时确实有一个明确的意图,而且它不是一般的目的我们的目的是为库方法返回类型提供一种有限的机制,在这种机制中,需要有一种清晰的方法来表示“无结果”,而使用null则极有可能导致错误。 例如,您可能不应该将其用于返回结果数组或结果列表的东西,而应该返回空数组或列表。您几乎不应该将其用作某物的字段或方法参数.

在最初发布的示例中,Optional<Y>被用作方法参数,因此这与Java最佳实践背道而驰。此外,Maybe在RxJava中是惯用的。

假设您有如下内容:

代码语言:javascript
复制
class X
class Y
data class DataContent constructor(val listOfX: List<X>, val y: Y)

您可以编写这样的函数,它似乎适合您的用例:

代码语言:javascript
复制
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) })

测试:

代码语言:javascript
复制
@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>()
            }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50384763

复制
相关文章

相似问题

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