Java 如何使用最少的代码比较整数?
模型中有一个名为foo的整数属性。现在我需要知道它是等于1还是2。我通常使用:Java 如何使用最少的代码比较整数?,java,Java,模型中有一个名为foo的整数属性。现在我需要知道它是等于1还是2。我通常使用: if (null != model) { Integer foo = model.getFoo(); if (foo != null) { if (foo == 1) { // do something... } if (foo == 2) { // do something... }
if (null != model) {
Integer foo = model.getFoo();
if (foo != null) {
if (foo == 1) {
// do something...
}
if (foo == 2) {
// do something...
}
}
}
有没有更方便的代码来避免NullPointerException?您可以执行
整数.of(1).equals(foo)
,但这有点愚蠢。为什么要保留这一行?我只是把它放在同一个if/else if
链中(如果它变长,考虑一个switch/case
(虽然它也不是空安全的)
还要注意的是,比较对象与
==
有点棘手,因为自动装箱是如何工作的(或者不工作)。我认为在这种情况下它可以工作,但我不想想想太多,所以在我的代码中,我通常会降到int
(在空检查之后)为了安全起见。编辑代码如下:
if (null != model) {
Integer foo = model.getFoo();
if (Integer.valueOf(1).equals(foo)) {
// do something...
}
if (Integer.valueOf(2).equals(foo)) {
// do something...
}
}
我希望能帮助您。您可以使用null-safe
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方法确定相等性
假设可能的值仅为
1
或2
当然,应该使用空检查来保护模型
使用三元运算符
Model theModel = model.getFoo() ;
if(model!=null && model.getFoo()!=null){
model.getFoo() == 1 ? callOne() : call2();
}
您可以使用
可选:
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;
...
}
});
如果没有返回null sentinels值,而是使用s,则可以执行以下操作:
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);
Optional model=getModel();
可选foo=model.flatMap(model::getFoo);
foo.filter(Integer.valueOf(1)::等于).ifPresent(this::doSomething);
foo.filter(Integer.valueOf(2)::等于).ifPresent(this::doSomethingElse);
Integer.valueOf(1).equals(foo)
,Integer.valueOf(2).equals(foo)
(Integer)model.getFoo().compareTo(1),(Integer)model.getFoo().compareTo(2)@ShivendraGupta如果model.getFoo()
是null
?@ShivendraGupta仍然会NPE。@ShivendraGupta如果foo
是null
,并且本质上与foo==1
,foo==2
相同,那么为什么没有人使用NullPointerException
呢?如果,我不应该认为这是一种疏忽原始代码,认为它在这些区块中做了不同的事情。注意,这消除了两个空检查,而不仅仅是OP不喜欢的一个。@Thilo跳过两个空检查不是比只跳过一个好吗?我想这取决于实际的使用情况。是的,这意味着表扬。你做得太好了!@Thilo我假设空检查会被保留ed.用空检查更新了答案。我会更新答案
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);