1、前语

实践项目中我们会有许多地方需求判空校验,假如不做判空校验则或许产生NullPointerException反常。

针对反常的处理我们在上一篇有提及:

先来看一下实践项目中一些判空办法

代码优雅之道——Java如何判空

代码优雅之道——Java如何判空

通常我们判别一个目标是否为Null,可以运用java.util中的Objects.nonNull(obj)、hutool中的ObjectUtil或许直接 null != obj

2、List的判空

像List这种比较特殊的在项目中或许不仅仅是判别非空了。对于List来说不等于null和List.size()不等于0是两回事,公司也有实习生常常有把这两个混淆的情况,list不等于null阐明现已初始化了,堆内存中有一块属于它的地盘,而size为0阐明还没往里面放东西,举个例子说便是不等于null代表我现在有个瓶子,size大于0阐明我向瓶子里装水了。

实践项目中也发现有直接用list.isEmpty()去判别的,来看一下源码

代码优雅之道——Java如何判空

相当于判别瓶子里有没有水(前提是瓶子现已存在,若瓶子不存在,则会抛出NullPointerException反常)。

所以通常情况下会连用list != null && list.size > 0 来判别,或许直接运用HuTool中CollUtil东西的isEmpty。诸如此类的还有Set、Map等

3、String的判空

这里还是用瓶子与水的概念,String为null时调用equals(String) 或 length() 等操作抛出 java.lang.NullPointerException。

代码优雅之道——Java如何判空

针对字符串判空有以下几种办法:

1、大多数人运用的办法之一,直观,方便,但功率低下:

if(a == null || a.equals(""));

2、比较字符串长度,高效:

if(a == null || a.length() == 0);

3、Java SE 6.0 才刚刚开始供给,功率和办法二差不多:

if(a == null || a.isEmpty());

当然还可以运用org.apache.commons.lang.StringUtils东西。

StringUtils.isNotBlank(a);

* StringUtils.isNotBlank(null) = false

* StringUtils.isNotBlank(“”) = false

* StringUtils.isNotBlank(” “) = false

* StringUtils.isNotBlank(“bob”) = true

* StringUtils.isNotBlank(” bob “) = true

该东西类中还有个isNotEmpty()办法,从注释可以很显着看出二者的不同

StringUtils.isNotEmpty(a);

* StringUtils.isNotEmpty(null) = false

* StringUtils.isNotEmpty(“”) = false

* StringUtils.isNotEmpty(” “) = true

* StringUtils.isNotEmpty(“bob”) = true

* StringUtils.isNotEmpty(” bob “) = true

4、Optional

Optional的出现便是用来避免NullpointException的。常见的办法有:

  • .empty():创立一个空的Optional实例
  • .of(T t) : 创立一个Optional 实例,为null时报反常
  • .ofNullable(T t):若t 不为null,创立Optional 实例,不然创立空实例
  • isPresent() : 判别容器中是否有值
  • ifPresent(Consume lambda) :容器若不为空则执行括号中的Lambda表达式
  • orElse(T t) : 获取容器中的元素,若容器为空则回来括号中的默认值
  • orElseGet(Supplier s) :假如调用目标包括值,回来该值,不然回来s 获取的值
  • orElseThrow() :假如为空,就抛出界说的反常,假如不为空回来当时目标
  • map(Function f): 假如有值对其处理,并回来处理后的Optional,不然回来Optional.empty()
  • flatMap(Function mapper):与map 相似,要求回来值有必要是Optional
  • T get() :获取容器中的元素,若容器为空则抛出NoSuchElement反常

先看个常见的示例:

baseInfo类中有布尔类型的属性,是空回来false,不为空取其值,需求四行。

代码优雅之道——Java如何判空

当运用Optional时,一行搞定,十分的高雅。

代码优雅之道——Java如何判空

4.1 Optional目标的创立

public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;
    //可以看到两个结构方格都是private 私有的
    //阐明 没办法在外面new出来Optional目标
    private Optional() {
        this.value = null;
    }
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    //这个静态办法大致 是创立出一个包装值为空的一个目标由于没有任何参数赋值
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    //这个静态办法大致 是创立出一个包装值非空的一个目标 由于做了赋值
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    //这个静态办法大致是 假如参数value为空,则创立空目标,假如不为空,则创立有参目标
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
}

4.2运用场景

场景1:在service层中 查询一个目标,回来之后判别是否为空并做处理

代码优雅之道——Java如何判空

场景2:运用Optional 和函数式编程,一行搞定

代码优雅之道——Java如何判空

5、总结

每种办法的存在必然有适用的场景,有些情况下这种链式编程,虽然代码高雅了。可是,逻辑性没那么显着,可读性有所降低,大家项目中看情况酌情运用。