Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用最少的代码比较整数?_Java - Fatal编程技术网

Java 如何使用最少的代码比较整数?

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... }

模型中有一个名为foo的整数属性。现在我需要知道它是等于1还是2。我通常使用:

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);