当前位置: 首页 > 知识库问答 >
问题:

Java8-abased变量&可选

袁赞
2023-03-14

我正在解析输入JSON。对于一个字段,有3种可能:

  • 字段不存在;
  • 该值设置为NULL;
  • 该值设置为有效值。
public class Data {
    private Optional<String> field;
}
    null

共有1个答案

夏侯枫
2023-03-14

我认为您不应该在此场景中使用可选。正如@Dkatzel在他的回答中提到的,它更多的是用作API返回值而不是字段。

尽管进行了这些学术讨论,但只要将data类中的字段初始化为它们的默认值,就可以完成您想要的任务:

public class Data {
    private String field = DEFAULT_VALUE;
}

然后让杰克逊做剩下的。

编辑2,考虑到OP的需求,即在解析JSON输入后,查找字段是否被填充、设置为null或输入JSON中是否不存在:

如果在解析输入JSON之后,您需要知道字段是否被填充、是否被设置为null或是否不存在,那么请考虑以下示例,它展示了我将采用的方法:

public class Data {

    private String field1 = "hello";

    private Integer field2 = 10;

    private Double field3 = 3.75;

    private static final Data DEFAULTS = new Data(); // defaults will be kept here

    public String getField1() {
        return this.field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public Integer getField2() {
        return this.field2;
    }

    public void setField2(Integer field2) {
        this.field2 = field2;
    }

    public Double getField3() {
        return this.field3;
    }

    public void setField3(Double field3) {
        this.field3 = field3;
    }

    @Override
    public String toString() {
        return "Data [field1=" + this.field1 + 
                   ", field2=" + this.field2 + 
                   ", field3=" + this.field3 + "]";
    }

    public boolean isDefault(Function<Data, Object> getter) {
        Object defaultProperty = getter.apply(DEFAULTS);
        Object actualProperty = getter.apply(this);
        return defaultProperty != null // needed to support fields with no default value
            && defaultProperty.equals(actualProperty);
    }

    public boolean isNull(Function<Data, Object> getter) {
        return getter.apply(this) == null;
    }

    public boolean isSet(Function<Data, Object> getter) {
        return !this.isNull(getter) && !this.isDefault(getter);
    }
}

在这里,我使用了私有静态属性来保存数据的默认值,并使用了3个方法来查询任何字段状态(default、null或set)。为了确定要查询哪个字段,这些方法接收一个函数 ,该函数被赋予一个data实例,并返回一个对象,该对象应该是所需的字段。(如果您停下来思考一下,getter可以被视为将实例作为输入并返回实例的特定字段的函数)。

因此,稍后,当您需要知道某个字段是如何到达JSON输入的时,只需使用以下3个查询方法即可:

ObjectMapper m = new ObjectMapper();

String json = "{\"field1\":null,\"field2\":20}";
Data data = m.readValue(json, Data.class);

System.out.println(data); // Data [field1=null, field2=20, field3=3.75]

System.out.println("field1 default ? " + data.isDefault(Data::getField1)); // false
System.out.println("field1 null ? " + data.isNull(Data::getField1)); // true
System.out.println("field1 set ? " + data.isSet(Data::getField1)); // false

System.out.println("field2 default ? " + data.isDefault(Data::getField2)); // false
System.out.println("field2 null ? " + data.isNull(Data::getField2)); // false
System.out.println("field2 set ? " + data.isSet(Data::getField2)); // true

System.out.println("field3 default ? " + data.isDefault(Data::getField3)); // true
System.out.println("field3 null ? " + data.isNull(Data::getField3)); // false
System.out.println("field3 set ? " + data.isSet(Data::getField3)); // false
 类似资料:
  • 只是在列表下面迭代 以上三个迭代有什么区别

  • 问题内容: 我如何在for循环中创建变量变量? 这是循环: 在此循环中,我想为每次传递创建一个$ seat变量,但必须像这样递增。第一次通过应该是,下次通过:等等。 所以最后应该是: 等等。 因此$ _POST的变量和内容应该是动态的。 问题答案: 首先,除非缺少某些内容,否则我将为此使用数组。具有像变量,等趋于具有少得多的效用和是更为繁琐比使用的阵列。 话虽这么说,使用以下语法: 最后,PHP具

  • 变量绑定默认是不可变的,但加上 mut 修饰语后变量就可以改变。 fn main() { let _immutable_binding = 1; let mut mutable_binding = 1; println!("Before mutation: {}", mutable_binding); // 正确代码 mutable_binding += 1

  • 如果我的API提供了一个流,客户端是否有办法修改基础集合? 例如: 客户端是否可以调用并以某种方式修改的内容?

  • 本文向大家介绍python不可变变量?相关面试题,主要包含被问及python不可变变量?时的应答技巧和注意事项,需要的朋友参考一下 不可变对象是指不可以被引用改变的对象,如字符串 #

  • null null null 所以现在,如果我想把一个应用程序部署到舞台上,我可以简单地运行这个playbook命令: 例如,我将staging/group_vars/webserver中的app1目录的路径定义为“/var/www/staging.app1.com”。但是我也需要为app2部署到相同的服务器上,但是目录不同。是否可以在group_vars中使用条件变量? 所以如果我跑: 敬请指教