模型中有一个名为foo的Integer属性。现在,我需要知道它等于1还是2。通常我使用:
if (null != model) {
Integer foo = model.getFoo();
if (foo != null) {
if (foo == 1) {
// do something...
}
if (foo == 2) {
// do something...
}
}
}
是否有一些简便的代码可以避免NullPointerException?
答案 0 :(得分:6)
您可以使用Optional
:
Optional.ofNullable(model)
.map(Model::getFoo)
.ifPresent(foo -> {
switch (foo) { // or if-else-if, the important thing is you skip the null check
case 1:
...
break;
case 2:
...
break;
...
}
});
答案 1 :(得分:2)
您可以使用null安全java.util.Object.equals
:
if(null != model) {
Integer foo = model.getFoo();
if(Objects.equals(foo, 1){
//do something
}
if(Objects.equals(foo, 2){
//do something
}
}
该方法具有以下说明:
如果参数彼此相等,则返回true,否则返回false。因此,如果两个参数都为null,则返回true;如果正好一个参数为null,则返回false。否则,将使用第一个参数的equals方法确定相等性。
答案 2 :(得分:1)
您可以做Integer.of(1).equals(foo)
,但这有点傻。为什么要保存一行?我只是将其放在相同的if/else-if
链中(如果长度过长,请考虑使用switch/case
(尽管它也不是null安全的)。
if (foo == null)
else if (foo == 1)
else if (foo == 2)
还要注意,将对象与==
进行比较有点棘手,因为自动装箱的工作原理(或不起作用)。我认为在这种情况下可以工作,但是我不想太费力地思考,因此在我的代码中,我通常会下降到int
(在空检查之后)为了安全起见。
答案 3 :(得分:1)
编辑代码,如下所示:
if (null != model) {
Integer foo = model.getFoo();
if (Integer.valueOf(1).equals(foo)) {
// do something...
}
if (Integer.valueOf(2).equals(foo)) {
// do something...
}
}
希望对您有所帮助。
答案 4 :(得分:1)
假设可能的值仅为1
或2
当然,应该使用null检查来保护模型
使用三元运算符
Model theModel = model.getFoo() ;
if(model!=null && model.getFoo()!=null){
model.getFoo() == 1 ? callOne() : call2();
}
答案 5 :(得分:1)
如果您没有返回空的前哨值,而是使用了Optional
,则可以这样做:
Optional<Model> model = getModel();
Optional<Integer> foo = model.flatMap(Model::getFoo);
foo.filter(Integer.valueOf(1)::equals).ifPresent(this::doSomething);
foo.filter(Integer.valueOf(2)::equals).ifPresent(this::doSomethingElse);