Optional对象是一种包装器对象,它被当作一种更安全的方式,用来替代 “T” 的引用,“T” 要么为某个对象引用,要么为null。
创建Optional的值
Optional.of(): 产生一个具有给定值的Optional。如果value为null,抛出NullPointException异常
Optional<String> optional = Optional.of("hello world");
Optional.ofNullable(): 产生一个具有给定值的Optional。如果value为null,返回空Optional
Optional<String> optional1 = Optional.ofNullable("hello world");
Optional<String> optional2 = Optional.ofNullable(null);
Optional.empty(): 产生一个空的Optional
Optional<String> optional = Optional.empty();
获取Optional的值
orElse(): 在没有值的情况下,会使用默认值,否则使用存在的值
Optional<String> optional = Optional.empty();
String ostr = optional.orElse("hello world");
输出 hello world
orElseGet(): 调用返回指定类型的代码
Optional<String> optional = Optional.empty();
String ostr = optional.orElseGet(() -> new Date().toString());
orElseThrow(): 在没有任何值的情况下抛出异常
Optional<String> optional = Optional.empty();
String ostr = optional.orElseThrow(IllegalAccessError::new);
消费Optional的值
获取Optional值时,在不存在任何值的情况下可以产生相应的替代物。消费Optional值时有一条策略是只有在其存在的情况下才消费该值
ifPresent(): 如果可选值存在,那么它会被传递给该函数。否则,就不会执行
//如果Option包装的String对象存在,则打印该字符串
Optional<String> optional = Optional.empty();
optional.ifPresent(v -> System.out.println(v));
处理Optional的值
map(): 使用map方法来转换Optional内部的值
//如果optional内部的值为空,map方法返回空
Optional<String> optional = Optional.of("hello world");
optional.map(String::toUpperCase);
//如果optional内部的值存在,将这个值添加到列表中,否则什么也不会发生
List<String> results = new ArrayList<>();
optional.map(results::add);
filter(): 在Optional包装的数据中获取满足条件的值,过滤不满足条件的值
//"hello world"长度不大于20,不满足条件,值被过滤
Optional<String> optional = Optional.of("hello world");
optional = optional.filter(s -> s.length()>20);
System.out.println(optional.orElse(""));
用flatMap构建Optional值的函数
flatMap():这个方法被用来将产生结果的两个方法组合起来,说的通俗一点就是后面的函数的参数值来自于前面的函数的返回值。
public static void main(String[] args) {
//调用get计算出的结果传递给get2,最后返回给result
Optional<Double> result = get1(12.0).flatMap(test::get2);
}
public static Optional<Double> get1(Double x){
return x == 0 ? Optional.empty() : Optional.of(x/2);
}
public static Optional<Double> get2(Double x){
return x < 0 ? Optional.empty() : Optional.of(x/2);
}
这篇文章介绍optional一些简单常用的使用方法