Java 可为空的类型是可选的吗?
是否可以通过某种方式将可空类型传递给可选类型? 例如:Java 可为空的类型是可选的吗?,java,kotlin,jackson,optional,nullable,Java,Kotlin,Jackson,Optional,Nullable,是否可以通过某种方式将可空类型传递给可选类型? 例如: X类( val x:可选 ) 为什么? 我希望通过以下方式序列化此文件: X(Optional.of(1)) -> {"x":1} X(Optional.of(null)) -> {"x":null} // <- throws X(Optional.empty()) -> {} X(可选。of(1))->{“X”:1} X(可选的.of(null))->{“X”:null}/{} 通知 我发现使用双可选选项可以
X类(
val x:可选
)
为什么?
我希望通过以下方式序列化此文件:
X(Optional.of(1)) -> {"x":1}
X(Optional.of(null)) -> {"x":null} // <- throws
X(Optional.empty()) -> {}
X(可选。of(1))->{“X”:1}
X(可选的.of(null))->{“X”:null}/{}
通知
我发现使用双可选选项可以实现我想要的功能,如下所示:
class X(
val x: Optional<Optional<String>>
)
X类(
val x:可选
)
但是如果有办法使用Kotlins可空类型或者知道为什么没有,那还是很有意思的。不建议使用
valx:Optional
,因为根据定义,您无法创建包含null
值的可选容器,如果您尝试使用Optional.of创建可选容器,您将遇到NPE(null)
Optional.of(value)
接受不可为空的值()和Optional.of可为空的值(value)
可以接受可为空的值,但将返回空的Optional
()
如果您希望能够以下面的方式序列化
X(Optional.of(1)) -> {"x":{"present":true}}
X(null) -> {"x":null}
您可以如下定义该类
class X(
val x: Optional<Int>?
)
由于默认情况下,Jackson会将其序列化为{“x”:{“present”:false}
。您必须避免的唯一选项是使用ObjectMapper
中的Jackson-datatype-jdk8
依赖项注册Jdk8Module
)
val mapper = ObjectMapper()
val jdk8Module = Jdk8Module()
jdk8Module.configureAbsentsAsNulls(true)
mapper.registerModule(jdk8Module)
但这将把一个空的可选变量视为javanull,从而序列化如下
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)->{}Optional.ofNullable
Optional.of(NULL)
将抛出NPEThis可选?
应该可以。尽管我建议定义一些特殊类来表达这种行为。
val mapper = ObjectMapper()
val jdk8Module = Jdk8Module()
jdk8Module.configureAbsentsAsNulls(true)
mapper.registerModule(jdk8Module)
X(Optional.empty()) -> {"x":null}
X(Optional.of(1)) -> {"x":1}