optional对象为一个包装类对象,它被当做一种更安全的方式引用类型T

创建一个Optional实例,它包装了一个非null的值

1
2
3
String a="h/e/l/lo";
List<String> b=new ArrayList<String>();
Optional<String> stringOptional= Arrays.stream(a.split("/")).findFirst();

获取optional的值

获取值,指定默认值
1
String result=stringOptional.orElse("default");
获取值,计算默认值(它返回一个字符串,表示获取 Java 版本。)如果Optional实例有值则对其执行调用给定的操作,如果Optional实例为空,则不执行任何操作
1
String result_1=stringOptional.orElseGet(()->System.getProperty("java.version"));
获取值,无值时抛出指定异常
1
String result_2=stringOptional.orElseThrow(()->new RuntimeException("无值"));

消费optional值

如果Optional实例有值则为其加入到数组b,如果Optional实例为空,则不进行任何操作
1
stringOptional.ifPresent(b::add);
如果Optional实例有值则将其使用传入的函数进行处理,如果Optional实例为空,则输出无值
1
2
3
4
stringOptional.ifPresentOrElse(
System.out::println,
()->System.out.println("无值")
);

管道化optional

使用map方法,将Optional实例的值转换成另一种类型,如果实例有值则对其执行调用给定的函数进行转换,否则不进行任何操作
1
stringOptional.map(String::toUpperCase);
用map方法,将Optional实例的值转换成另一种类型,只处理满足条件的数据
1
stringOptional.filter(s->s.startsWith("a")).map(String::toUpperCase);
使用or,将optional加入可替代项目,如果stringOptional为空,则返回b的第一个元素
1
stringOptional.or(()->b.stream().findFirst());

注意

  • 不要在集合中定义Optional实例,尽量使用Optional提供的静态工厂方法创建Optional实例
  • 不要将optional作为map中的键