说明
- Optional类是一个可以为null的容器对象,java8首次提供。
- Optional是个容器,将具体的对象放置其中,按照网上说法,可以优雅处理null问题,包括常见的空指针异常。
- 在代码中引用Optional,代码会更漂亮,但个人感觉使用的时候,不够直接,不如原始写法舒畅,另在代码逻辑中,通常判断为null时,需要return操作,在这个场景下,感觉Optional类体现不出优势,但对于有为空设置默认值的场景,Opional类确实比较好用。
- Opional类中的一些方法,我个人尚未理解。比如map,flatmap,filter方法,将处理逻辑放置其中,在功能归属上是不是合理?
- 以上仅个人看法。
方法
isPresent
- 是否存在
- 判断容器内的对象是否为null
Integer a = 1;
Integer b = null;
Optional<Integer> oa = Optional.of(a); //of 方法不允许参数为null
Optional<Integer> ob = Optional.ofNullable(b); //ofNullable 方法允许传递null, 当参数为null时,等价于Optional.empty()
System.out.println(oa.isPresent()?"a 不为空":"a 为空");
System.out.println(ob.isPresent()?"b 不为空":"b 为空");
结果
a 不为空
b 为空
get/orElse/orElseGet/orElseThrow
- 获取容易内对象
- 容器内对象不为null时,返回该对象,否则按方法规则做不同的处理
Integer a = 1;
Integer b = null;
Optional<Integer> oa = Optional.of(a);
Optional<Integer> ob = Optional.ofNullable(b);
// 容器内对象为空时,会抛出异常,用于确认容器内对象不为空时的取值
a = oa.get();
// 容器内对象为空时,返回参数的值,否则返回容器内对象
b = ob.orElse(7);
System.out.println(a);
System.out.println(b);
// 参数为一个实现Supplier接口的类,需要实现接口中的get方法
// 容器内对象为空时,返回由参数生成的值,否则返回容器内对象
Integer c = ob.orElseGet(() -> 9);
System.out.println(c);
// 参数为一个实现Supplier接口的类,需要实现接口中的get方法,返回一个异常
// 容器内对象为空时,抛出一个参数生成的自定义的异常,否则返回容器内对象,参数为空时,抛出Exception
Integer d = ob.orElseThrow(() -> new RuntimeException("null exception"));
System.out.println(d);
结果
1
7
9
Exception in thread "main" java.lang.RuntimeException: null exception
at com.qinsy.sample.OptionalExecutor.lambda$getAndOrElse$1(OptionalExecutor.java:55)
at java.base/java.util.Optional.orElseThrow(Optional.java:403)
at com.qinsy.sample.OptionalExecutor.getAndOrElse(OptionalExecutor.java:55)
at com.qinsy.sample.OptionalExecutor.main(OptionalExecutor.java:10)
ifPresent
- 如果存在
- 如果值存在则使用该值调用参数内方法, 否则不做任何事情。
Integer a = 1;
Integer b = null;
Optional<Integer> oa = Optional.of(a);
Optional<Integer> ob = Optional.ofNullable(b);
oa.ifPresent(System.out::println);
ob.ifPresent(System.out::println);
结果
1
map
- 映射
- 如果值为null,或通过映射后的值为null,返回包含映射返回值的Optional对象,否则返回空Optional
String str = "abc";
Optional os = Optional.ofNullable(str).map(String::length);
System.out.println(os.orElse("none")); // 因为没有指定Optional的类型,故此处类型为Object,所以不会出类型错误
结果
3
flatMap
- 映射
- 如果值为null,或通过映射后的值为null,返回包含映射返回值的Optional对象,否则返回空Optional。与map方法类似,二者参数不同,map的参数为映射方法,flatMap的参数是包含映射方法的Optional
String str = "abc";
Optional os = Optional.of(str).flatMap(s -> Optional.ofNullable(s.length()));
System.out.println(os.orElse("none"));
结果
3
filter
- 是否存在
- 如果值存在,并且这个值匹配给定的predicate,返回包含该值的Optional,否则返回一个空的Optional
String str = "abc";
Optional os = Optional.of(str).filter(s -> s.length() > 2);
System.out.println(os.orElse("none"));
结果
abc