gpt4 book ai didi

java - 可空类型的可选?

转载 作者:行者123 更新时间:2023-12-02 12:51:54 28 4
gpt4 key购买 nike

是否有可能以某种方式将可空类型传递给 Optional?示例:

class X(
val x: Optional<Int?>
)

为什么?

我想按以下方式序列化:

X(Optional.of(1)) -> {"x":1}
X(Optional.of(null)) -> {"x":null} // <- throws
X(Optional.empty()) -> {}

通知

我发现可以使用 double Optional 来做我想做的事情,就像这样:

class X(
val x: Optional<Optional<String>>
)

但是,如果有一种方法可以使用 Kotlin 的可空类型,或者知道为什么没有这种方法,这仍然很有趣。

最佳答案

拥有val x: Optional<Int?>不建议这样做,因为您不能创建带有 null 的 Optional 容器其定义中的值,如果您尝试使用 Optional.of(null) 创建一个 Optional,您将遇到 NPE . Optional.of(value)接受一个不可为 null 的值 ( doc ) 和 Optional.ofNullable(value)可以接受一个可为 null 的值,但会返回一个空的 Optional (doc)。

如果你希望能够以下面的方式序列化

X(Optional.of(1)) -> {"x":{"present":true}}
X(null) -> {"x":null}

你可以定义类如下

class X(
val x: Optional<Int>?
)

棘手的部分是能够如下序列化

X(Optional.empty()) -> {}

因为默认情况下,Jackson 会将其序列化为 {"x":{"present":false}} .您必须避免的唯一选择是注册 Jdk8Module ( source ) 和 jackson-datatype-jdk8依赖于 ObjectMapper通过

val mapper = ObjectMapper()
val jdk8Module = Jdk8Module()
jdk8Module.configureAbsentsAsNulls(true)
mapper.registerModule(jdk8Module)

但这会将一个空的 Optional 视为 Java null,从而序列化如下

X(Optional.empty()) -> {"x":null}
X(Optional.of(1)) -> {"x":1}

Optional.ofNullable(value)null作为value行为类似于 Optional.empty()因为两者都会返回一个空的 Optional .

获得X(Optional.empty()) -> {}的唯一方法将通过用 @JsonInclude(JsonInclude.Include.NON_NULL) 注释该字段来实现,但这也意味着您将获得序列化 X(null) -> {}

关于java - 可空类型的可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881597/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com