【问题标题】:Accessing internal json field with optional checking null使用可选检查 null 访问内部 json 字段
【发布时间】:2020-12-10 12:01:38
【问题描述】:

我有一个这样的 json:

{
    "name": "car",
      "attributes": {
        "lon": 13,
        "lat": 15
    }
}

有时某些属性可以为空。

Optional<Attributes> op = Optional.ofNullable(json);

if (op.isPresent()) {
    Optional<Integer> opI = Optional.ofNullable(op.get().getLon());
   opI.ifPresent(....);
}

如何避免在多行中使用 Optional,有没有安全的方法来减少它。想象一下,你有一个这样的 json。

{"object1": {
    "object2": {
       "object3": {
           "object4: {

并且您需要访问 object4 但检查之前的某些对象是否为空,我的方法使用可选。这不是最好和更优雅的解决方案。

使用 optional 和减少代码,我能以优雅的方式做什么?

【问题讨论】:

    标签: java-8 jackson optional


    【解决方案1】:

    你只需使用Optional.map,当可选为空时它会跳过你给它的代码

    Integer lon = Optional.ofNullable(json).map(Attributes::getLon).orElse(null);
    

    您可以在连续的选项上链接任意数量的中间map() 调用。如果可选项为空,map() 将跳过对您提供的函数的调用。

    所以,对于你的其他情况:

    var object4 = Optional.ofNullable(mainObject)
                      .map(MainObject::getObject1)
                      .map(Object1:getObject2)
                      .map(Object2:getObject3)
                      .map(Object3:getObject4)
                      .orElse(null); //set object4 to null if anything was missing
    

    需要牢记的重要信息(来自链接的 JavaDocs):

    如果存在值,则对其应用提供的映射函数,如果结果为非空,则返回描述结果的 Optional。否则返回一个空的 Optional。

    因此,如果任何 getObjectN 返回 null,则生成的可选项将为空。

    【讨论】:

    • 太好了,我知道地图,但我没有意识到我可以在这种情况下使用。有时我把一些简单的事情复杂化了。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多