利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE
使用Optional 1 2 3 Person person=new Person(); return Optional.ofNullable(person).orElse("person为null" );
创建Optional对象 1 2 3 4 5 6 7 Optional<String> optEmpty = Optional.empty(); Optional<String> optOf = Optional.of("optional" ); Optional<String> optOfNullable1 = Optional.ofNullable(null ); Optional<String> optOfNullable2 = Optional.ofNullable("optional" );
Optional.get()方法(返回对象的值) 1 2 3 4 5 6 7 8 public T get () { if (value == null ) { throw new NoSuchElementException("No value present" ); } return value; } Optional.ofNullable(person).get();
Optional.isPresent()方法(判读是否为空) 1 2 3 4 5 6 7 8 9 10 11 public Boolean isPresent () { return value != null ; } if (Optional.ofNullable(person).isPresent()){ System.out.println("不为空" ); } else { System.out.println("为空" ); }
Optional.ifPresent()方法(判读是否为空并返回函数) 1 2 3 4 5 6 7 8 public void ifPresent (Consumer<? super T> consumer) { if (value != null ) consumer.accept(value); } Optional.ofNullable(person).ifPresent(p -> System.out.println("年龄" +p.getAge()));
Optional.filter()方法(过滤对象) filter()方法大致意思是,接受一个对象,然后对他进行条件过滤,如果条件符合则返回Optional对象本身,如果不符合则返回空Optional
1 Optional.ofNullable(person).filter(p -> p.getAge()>50 );
Optional.map()方法(对象进行二次包装) map()方法将对应Funcation函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
1 String optName = Optional.ofNullable(person).map(p -> person.getName()).orElse("name为空" );
Optional.orElse()方法(为空返回对象) 如果包装对象为空的话,就执行orElse方法里的value,如果非空,则返回写入对象
1 2 3 4 public T orElse (T other) { return value != null ? value : other; }
Optional.orElseGet()方法(为空返回Supplier对象) 1 2 3 4 5 6 7 public T orElseGet (Supplier<? extends T> other) { return value != null ? value : other.get(); } Optional<Supplier<Person>> sup=Optional.ofNullable(Person::new ); Optional.ofNullable(person).orElseGet(sup.get());
Optional.orElseThrow()方法(为空返回异常) 1 Optional.ofNullable(member).orElseThrow(() -> new ServiceException("没有查询的相关数据" ));
实战场景再现
1 2 3 4 5 6 7 8 9 Member member = memberService.selectByIdNo(request.getCertificateNo()); Optional.ofNullable(member).orElseThrow(() -> new ServiceException("没有查询的相关数据" )); ----------------------------------------------------------------------------------------- Optional<Location> findLocationById (String id) ;