使用Optional优雅解决Npe

884 阅读1分钟

Optional可以优雅的处理NPE(空指针)问题

获取Optional对象

  • empty()
    // 返回一个空的Optional对象
    Optional<Customer> empty = Optional.empty();
  • of(T value),创建一个不可为空的Optional
    // 返回一个Optional对象,如果参数为空则抛NPE异常
    Optional<Customer> customerOpt1 = Optional.of(customer);
  • ofNullable(T value),创建一个可为空的Optional
    // 返回一个Optional对象,如果参数为空则返回一个空对象
    Optional<Customer> customerOpt2 = Optional.ofNullable(customer);

首先创建一个Customer类, 属性如下

    public class Customer {

        private String id;

        private String name;
    
        //get set 和 构造方法
    
        @Override
        public String toString() {
            return "Customer{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
        }
    }

isPresent() 和 ifPresent()

isPresent(): 判断值是否存在

  • Java7
    if (customer != null) {
        // doSomething
    }
  • Java8
    if (customerOpt1.isPresent()) {
        // doSomething
    }


ifPresent(): 如果值存在则进行处理逻辑,否则跳过

  • Java7
    if (customer != null) {
        if (customer.getId().length() == 1) {
            System.out.println(customer.getName());
        }
    }

  • Java8
    customerOpt1.ifPresent(c -> {
        if (c.getId().length() == 1) {
            System.out.println(c.getName());
        }
    });


orEls & orElseGet & orElseThrow 区别

都是Optional为空的话进行相对的处理

  • orElse: 值存在直接返回value,否则返回输入的other
    // 源码
    public T orElse(T other) {
        return value != null ? value : other;
    }
    // 例子
    Customer cus = new Customer();
    cus.setId("123");
    
    Customer customerElse = Optional.ofNullable(cus).orElse(new Customer("456", "Tom"));
    System.out.println(customerElse);
    
    // 输出
    Customer{id='123', name='null'}
  • orElseGet: 值存在直接返回value,否则执行输入的other
    // 源码
    
    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

    // 例子
    Customer cus = null;
    Customer customerGet = Optional.ofNullable(cus).orElseGet(() -> new Customer("456","Keven"));
    System.out.println(customerGet);   
    
    // 结果
    Customer{id='456', name='Keven'}
    
  • orElseThrow: 值存在直接返回value,否则抛出一个异常
    // 源码
    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }
    // 例子
    Customer cus = null;
    Customer customerElse = Optional.ofNullable(cus).orElseThrow(RuntimeException::new);
    System.out.println(customerElse);

filter

可以过滤需要的值

    Optional<Customer> cusOpt = customer1
                .filter(c -> c.getId() != null && c.getName().length() > 2);

map

可以获取需要的值

    String s = customer1
                    .map(c -> c.getName()).orElse("null value");