Java8-Optional
前言
身为java程序员,大家最经常遇到的或者是最容易忽视的就是npe。
当我们在调用某个方法获取返回值时,可能会直接去get或者其他操作,这就会引起npe。所以通常我们会进行判断是否为Null的操作,只有非空的前提下才能作为参数。
在java8的新特性中,Optional类就是其一。
文档是这样介绍的
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
下面就来介绍一下Optional类中的几个方法
of → 为非null的值创建一个Optional对象
/**
* Optional.of
* 通过工厂方法创建Optional实例
*/
Optional<String> optional = Optional.of("chen");
注意
of方法中会对传入的值进行null的判断,如果为Null则直接抛异常,所以一般会在确定当前参数一定不为空的情况下才用
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
ofNullable → 为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
/**
* Optional.ofNullable
*/
Optional<Object> optionalO = Optional.ofNullable(null);
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
isPresent → 如果值存在返回true,否则返回false。
Optional<String> optional = Optional.of("chen");
if (optional.isPresent()){
System.out.println(optional.get());
}
get → 如果当前Optional对象有值则返回,否则抛出异常
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
ifPresent → 如果Optional实例有值则为其调用consumer,否则不做处理
Optional<String> optional = Optional.of("chen");
optional.ifPresent(System.out::println);
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
orElse → 如果有值则将其返回,否则返回指定的其它值。
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElse("wang"));
orElseGet →
orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElseGet(() -> "default valve"));
orElseThrow → 如果有值则将其返回,否则抛出supplier接口创建的异常。
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElseThrow(NullPointerException::new));
map → 如果有值,则对其执行调用mapping函数得到返回值。
如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。
Optional<String> optional = Optional.ofNullable(null);
Optional<String> stringOptional = optional.map(String::toLowerCase);
System.out.println(stringOptional.orElse("no valve found"));
flatMap → flatMap方法与map方法类似,区别在于mapping函数的返回值不同
map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
Optional<String> optional = Optional.ofNullable(null);
Optional<String> stringOptional = optional.flatMap( o -> Optional.of(o.toLowerCase()));
System.out.println(stringOptional.orElse("no valve found"));
filter → 如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
Optional<String> optional = Optional.of("chen");
Optional<String> stringOptional = optional.filter(s -> s.length() < 4);
System.out.println(stringOptional.orElse("The str length is greater or equal to 4 chars"));
文档参考: