其它

Java8 Optional

2021-01-23 07:25:45 阅读数 5287 收藏 0

Optional 类是一个可以为 null 的容器对象,平常我们通过调用一个方法得到了返回值事需要判断返回值是否为 null,只有非空情况下才会将其传入给其它方法,Optional 能避免源码被各种 null 检查污染,开发出更简洁的代码

相关方法

of

  • 为非 null 值创建一个 Optional,创建对象时参数不能为 null,否则会抛出 NullPointerException 异常
//调用工厂方法创建Optional实例
Optional<String> name = Optional.of("Sanaulla");

//传入参数为null,抛出NullPointerException.
Optional<String> someNull = Optional.of(null);

of Nullable

  • 与 of 方法不同的是可以接受 null 值情况
//下面创建了一个不包含任何值的Optional实例
//例如,值为'null'
Optional empty = Optional.ofNullable(null);

isPresent

  • 如果值存在返回 true,否则 false
//isPresent方法用来检查Optional实例中是否包含值
if(name.isPresent()) {
  //在Optional实例内调用get()返回已存在的值
  System.out.println(name.get());
  //输出Sanaulla
}

get 方法

  • 如果有值则返回,否则出 NoSuchElementException
//执行下面的代码会输出:No value present
try{
//在空的Optional实例上调用get(),抛出NoSuchElementException
System.out.println(empty.get());
}
catch(NoSuchElementException ex) {
System.out.println(ex.getMessage());
}

ifPresent

  • 如果 Optional 实例有值则为其调用 consumer,否则不做处理,Comsumer 包含一个抽象方法,该方法传入对值进行处理,没有返回值
//ifPresent方法接受lambda表达式作为参数。
//lambda表达式对Optional的值调用consumer进行处理。
name.ifPresent((value) -> {
System.out.println(
"The length of the value is: "
+ value.length());
});

orElse

  • 如果有值则返回,否则返回其它值
//如果值不为null,orElse方法返回Optional实例的值。
//如果为null,返回传入的消息。
//输出:There is no value present!
System.out.println(empty.orElse("There is no value present!"));
//输出:Sanaulla
System.out.println(name.orElse("There is some value!"));

orElseGet

  • 与 orElse 类似,区别在于得到的默认值,orElse 传入字符串作为默认值,orElseGet 可以通过接收 Supplier 接口实现用来生成默认值
//orElseGet与orElse方法类似,区别在于orElse传入的是默认值,

//orElseGet可以接受一个lambda表达式生成默认值。

//输出:Default Value
System.out.println(empty.orElseGet(() ->"Default Value"));

//输出:Sanaulla
System.out.println(name.orElseGet(() ->"Default Value"));

orElseThrow

  • 如果有值将其返回,否则抛出 supplier 接口创建的异常
try{
  //orElseThrow与orElse方法类似。与返回默认值不同,
  //orElseThrow会抛出lambda表达式或方法生成的异常
  empty.orElseThrow(ValueAbsentException::new);
}
catch(Throwable ex) {
  //输出: No value present in the Optional instance
  System.out.println(ex.getMessage());
}