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中的键