很好地编写了一个在java中可以为null的数字

时间:2015-06-19 12:17:41

标签: java type-conversion implicit-conversion

我有一个应用程序,我需要处理来自外部源的很多数字(整数或长整数)。

数字可以为空。如果它们为null,我总是需要将它们转换为0.

问题似乎微不足道,但我不想写数百次:

if (someNumber == null) {
    someNumber = 0;
} 

我不喜欢它有两个原因:

  1. 我不想为这么简单的任务写三行代码,特别是因为我需要做很多次
  2. 我不想变异"变异" someNumber(为someNumber变量赋值)
  3. 我尝试了其他一些方法,可以在这里看到:

      public static void main(String[] args) {
        Integer zeroOrNull = new Random().nextBoolean() ? 0 : null;
    
    
        // version1: this is nasty (I already mentioned why)
        if (zeroOrNull == null) {
          zeroOrNull = 0;
        }
    
        // version2: this seems to much for so simple task...
        zeroOrNull = Optional.ofNullable(zeroOrNull).orElseGet(() -> 0);
    
        // version3: creating an util might be considerable. Is there already such predefined util ?
        zeroOrNull = MyUtil.getValueOrZero(zeroOrNull); // returns value or )
    
        System.out.println(zeroOrNull); // I want 0 here in case of null
    
    
      }
    

    执行此类操作的优先方式是什么?#34;测试null /转换为0" ?是否有机会隐式进行此转换?

5 个答案:

答案 0 :(得分:4)

使用i = (i==null)?0:i;

  • 一行检查
  • 没有方法调用
  • 简单明了
  • 没有额外的依赖(与其他一些提议的解决方案不同)

将此支票尽可能靠近您的号码来源,以避免不必要的重复。

答案 1 :(得分:2)

通过创建Null Checker的重载版本

public static void main(String args[]) {

    Integer intObj = null;
    System.out.println("intObj : " + checkNull(intObj));

    intObj = 1122222;
    System.out.println("intObj : " + checkNull(intObj));

    Long longObj = null;
    System.out.println("longObj : " + checkNull(longObj));

    longObj = 666555556L;
    System.out.println("longObj : " + checkNull(longObj));

    System.out.println("*********With default value***********");

    intObj = null;
    System.out.println("intObj : " + checkNull(intObj, 1));

    intObj = 1122222;
    System.out.println("intObj : " + checkNull(intObj, 1));

    longObj = null;
    System.out.println("longObj : " + checkNull(longObj, 0L));

    longObj = 666555556L;
    System.out.println("longObj : " + checkNull(longObj, 0L));
}

static Integer checkNull(Integer obj) {
    if (obj == null)
        return 0;
    return obj;
}

static Long checkNull(Long obj) {
    if (obj == null)
        return 0L;
    return obj;
}

static Integer checkNull(Integer obj, int i) {
    if (obj == null)
        return i;
    return obj;
}

static Long checkNull(Long obj, long l) {
    if (obj == null)
        return l;
    return obj;
}

答案 2 :(得分:1)

一个简单的解决方案是编写如下的实用方法:

public static Integer checkNullNumber(Integer i){
if(i == null)
   return 0;
return i;
}

现在您可以在任何地方使用此方法:

zeroOrNull = checkNullNumber(zeroOrNull);

答案 3 :(得分:1)

  

我不想为这么简单的任务编写三行代码,   特别是因为我需要多次这样做

if(zeroOrNull == null)zeroOrNull = 0;

  

我不想变异"变异" someNumber(为someNumber分配新值   变量)

无法将空值更改为" 0"没有构造一个新的Integer对象,它拥有这个" 0"而这一行代码就是这样做的

答案 4 :(得分:-1)

  

使用java8 java.util.Optional类非常有效,但不能使用   显式空值,使用空可选

这是我原来的答案,如果"高效"只是通过"表现"我很抱怨,抱歉。

意思是所有编码过程都更好,开发和执行更安全。

http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html