Optional工具类
- 基本概念
- Optional类的使用
- Optioanl对象创建
- of
- ofNullable
- empty
- Optional常用方法
- isPresent
- get
- orElse
- orElseGet
- orElseThrow
- map
- flatMap
- filter
- ifPresent
- ifPrsentOrElse
- equals
基本概念
- Optional类:
- Optional是一个可以为null的容器对象.可以保存指定类型的值,也可以只保存null. 要么有值,要么为null
- Optional中提供很多方法来避免显式的进行空值检查.如果值存在则调用isPresent() 方法会返回true, 调用get() 方法就会返回这个对象
- Optional类是一个没有子类的工具类,很好的解决了空指针异常问题
Optional类的使用
- Java 8以前,通常使用if…else… 对对象进行是否为空的判断,然后再进行逻辑处理,这样的代码非常冗余
- Java 8中新增了Optional类,使用这个类可以避免空指针检查,使代码更加优雅
Optioanl对象创建
of
- of() 方法不支持null对象
Optional.of(T t);
ofNullable
- ofNullable() 方法支持null对象
Optional.ofNullable();
empty
- empty() 方法可以直接创建一个空的Optional对象
Optional.empty();
Optional常用方法
isPresent
- isPresent(): 判断是否包含值
- 如果包含值则返回true
- 如果不包含值则返回false
Optional<Object> optional = Optional.empty();
// false
boolean optionalPresent = optional.isPresent();
get
- get(): 获取包含的值
- 如果有值则返回这个值
- 否则抛出NoSuchElementException: No value present异常
Optional<Object> optional = Optional.empty();
// NoSuchElementException: No value present
Object o = optional.get();
orElse
- orElse(str): 如果调用对象包含值则返回这个值,否则返回参数字符串str
String message = optional.orElse("Optional对象的值为空!");
orElseGet
- orElseGet(supplier): 如果调用对象包含值则返回这个值,否则返回Lambda表达式获取的值
- orElseGet() 和orElse() 比较:
- orElseGet() 和orElse() 类似,只是传递的参数类型不同
- orElseGet() 的参数是Lambda类型
- orElse() 的参数是String类型
String value = optional.orElseGet(() -> "Optional对象的值为空!");
orElseThrow
- orElseThrow(exceptionSupplier): 如果调用对象包含值则返回这个值,否则抛出Lambda表达式中Supplier继承的异常
String value = optional.orElseThrow(() -> new RunTimeExeception("Optional对象中的值不存在!"));
map
- map(): 如果调用的对象有值,则进行处理,并且返回处理后的Optional对象.否则返回Optional.empty()
- Optional中的map() 方法和Stream流中的map() 方法类似,可以用于类型转换等操作
Optional<String> map = optional.map(p -> p.getName());
flatMap
- flatMap(): 如果调用的对象有值,则执行mapping函数返回Optional类型的值.否则返回空Optional对象Optional.empty()
- flatMap() 和map() 比较:
- Optional中的flatMap() 和map() 方法类型,区别只是在于mapping的返回值不同
- map() 方法的mapping函数返回值可以是任何类型的对象,在map() 方法返回之前会包装为Optional对象
- flatMap() 方法的mapping函数调用对象必须是Optional对象,调用结束后 ,flatMap() 中不会对结果使用Optional进行封装
// map()方法
Optional<String> map = optional.map(p -> p.getName());
// flatMap()方法
Optional<String> flatMap = optional.flatMap(p -> Optional.of(p.getName()));
filter
- filter(predicate): 通过传入的Predicate限定条件对Optional对象中的值进行过滤. 如果Optional对象中有值并且满足Predicate过滤条件,就返回包含这些值的Optional对象,否则返回空Optinal对象Optional.empty()
String filter = optional.filter(s -> s.length > 0).orElse("Optional对象中的值不存在!");
ifPresent
- ifPresent(consumer): 如果调用的对象包含值则使用对象的值调用consumer处理.否则不进行任何操作
optional.ifPresent(System.out :: println);
ifPrsentOrElse
- ifPresentOrElse(): Java 9以后的方法.如果调用的对象包含值则使用对象的值调用consumer.否则执行自定义的Runnable操作
optional.ifPresentOrElse((str) -> System.out.println(str.toUpperCase()), () -> System.out.println("Optional对象中的值不存在!"));
equals
- equals(): 判断其余对象是否和Optional对象相等
boolean flag = optional.equals(obj);