Optional 类是一个可以作为null容器的对象,若值存在调用
isPresent()
就返回 true,调用get()
会返回该对象。Optional是一个容器,可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,我们可以不用那么拙劣的检测空值。
使用Option可以很好解决的NPE
类声明
public final class Optional<T> extends Object()
类方法
I、of
返回一个指定非null的Optional值
//调用工厂创建Optional的实例
Optional<String> name = Optional.of("孙舒蕊");
//传入参数为Null,抛出NPE
Optional<String> someNull = Optional.of(null);
II、ofNullable
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
ofNullable 与 of 的方法相似,唯一的区别是可以接受参数为null的情况。
//创建一个不包含任何值得Optional
Optional empty = Optional.ofNullable(null);
III、ifPresent
如果Optional实例有值则为其调用 consumer,否则不做处理
如果Optional实例有值,调用ifPresent()可以接受接口或lambda表达式。
name.ifPresent((value) -> {
System.out.println("===="+value.length());
})
VI、orElse
如果有值则将其返回,否则返回指定的其他的值
如果Optional实例有值则将其返回,否则返回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!"));
V、orElseGet
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"));
VI、map
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
//map方法执行传入的lambda表达式参数对Optional实例进行修改
//为lambda表达式的返回值创建新的Optional实例作为 map 的方法返回值
Optional<String> upperName= name.map((vlaue) -> value.toUpperCase());
System.out.println(upperName.orElse(" "));
VII、flatMap
如果有值,为其执行mapping函数返回值,否则返回空的Optional。flatMap和map(Function) 方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会结果用Optional封装。
flatMap方法与map方法类似,区别在于mapping函数的返回值不同 。map方法的mapping函数返回值可以使任何类型T,而flatMap方法的参数map函数,使用flatMap重写的示例如下。
//flatMap 与 map(Function) 非常类似,区别在于传入方法的lambda表达式的返回值类型
//map方法中的lambda表达式的返回值是可以任意类型的,在map函数返回之前会包装成Optional,
//但是flatMap方法中的lambda表达式返回值必须是Optional的实例
upperName=name.flatMap((value) -> Optional.of(value.toUpperCase()));
System.out.println(upperName.orElse("No value found"));
//输出SANAULLA
VIII、filter
//filter方法检查给定的Optional值是否满足某些条件
//如果满足返回一个Optional实例,否则返回空的Optional
Optional<String> name=Optional.of("Christina");
Optional<String> longName=name.filter((value) -> value.length() > 6);
System.out.println(longName.orElse("这个人的名字没有六个字符大1"));
//下面的例子不满足
Optional<String> anotherName=Optional.of("Sana");
Optional<String> shortName=anotherName.filter((value) -> value.length()>6);
System.out.println(shortName.orElse("这个人的名字没有六个字符大2"));
===================输出================================
Christina
这个人的名字没有六个字符大2