// 获取当前行政区最顶级的省信息名称 没有则显示error String result = Optional.ofNullable(country) .map(Country::getCity) .map(City::getProvince) .map(Province::getName) .orElse("error"); 1、empty() empty 方法返回一个不包含值的 Optional 实例,单独使用没什么意义,主要和其他方法搭配使用。 Optional optional = Optional.empty(); System.out.println(optional); -- 输出结果 Optional.empty 2、of() of 方法会返回一个 Optional 实例,如果传入的值非空,会返回包含指定值的对象;如果传入空,会立刻抛出空指针异常。 // 非空情况下,会正常返回 Optional optional = Optional.of("hello world"); System.out.println(optional); -- 输出结果 Optional[hello world] // 为空情况下,会抛空指针异常 Optional optional = Optional.of(null); System.out.println(optional); -- 输出结果 Exception in thread "main" java.lang.NullPointerException at java.util.Objects.requireNonNull(Objects.java:203) at java.util.Optional.<init>(Optional.java:96) at java.util.Optional.of(Optional.java:108) 3、ofNullable() ofNullable 方法会返回一个 Optional 实例,如果传入的值非空,会返回包含指定值的对象;如果传入空,会返回不包含任何值的 empty 对象,也就是最开始介绍的Optional.empty()对象。 // 非空情况下,会正常返回 Optional optional = Optional.ofNullable("hello world"); System.out.println(optional); -- 输出结果 Optional[hello world] // 为空情况下,会返回 empty 对象 Optional optional = Optional.ofNullable(null); System.out.println(optional); -- 输出结果 Optional.empty 4、isPresent() isPresent 方法用来判断实例是否包含值,如果包含非空值,返回 true,否则返回 false。 // 非空值,返回true boolean rs1 = Optional.ofNullable("hello").isPresent(); System.out.println(rs1); // 空值,返回false boolean rs2 = Optional.ofNullable(null).isPresent(); System.out.println(rs2); -- 输出结果 true false 5、get() get 方法,如果实例包含非空值,则返回当前值;否则抛出 NoSushElementException 异常。 // 非空值,返回当前值 Object rs = Optional.ofNullable("hello world").get(); System.out.println(rs); -- 输出结果 hello world // 空值,会抛出 NoSushElementException 异常 Object rs = Optional.ofNullable(null).get(); System.out.println(rs); -- 输出结果 Exception in thread "main" java.util.NoSuchElementException: No value present at java.util.Optional.get(Optional.java:135) 6、ifPresent() ifPresent 方法作用是当实例包含非空值时,执行传入的 Consumer,比如调用一些其他方法;如果包含的值为空,不执行任何操作。 Optional.ofNullable("hello world") .ifPresent( x -> { System.out.println(x); }); -- 输出结果 hello world 7、filter() filter 方法用于过滤不符合条件的值,接收一个Predicate参数,如果符合条件,会返回当前的Optional实例,否则返回 empty 实例。 Optional.ofNullable("hello world") .filter(x -> x.contains("hello")) .ifPresent(x -> { System.out.println(x); }); -- 输出结果 hello world 8、map() map 方法是链式调用避免空指针的核心方法,当实例包含值时,对值执行传入的Function函数接口方法,并返回一个代表结果值新的Optional实例,也就是将返回的结果再次包装成Optional对象。 Optional.ofNullable("hello+world") .map(t -> { if(t.contains("+")){ return t.replace("+", " "); } return t; }).ifPresent(t -> { System.out.println(t); }); -- 输出结果 hello world 9、flatMap() flatMap 方法与 map 方法类似,唯一不同的地方在于:需要手动将返回的值,包装成Optional实例,并且参数值不允许为空。 Optional.ofNullable("hello+world") .flatMap(t -> { if(t.contains("+")){ t = t.replace("+", " "); } // 不同之处 return Optional.of(t); }).ifPresent(t -> { System.out.println(t); }); -- 输出结果 hello world 10、orElse() orElse 方法作用是如果实例包含非空值,那么返回当前值;否则返回指定的默认值。 Object rs = Optional.ofNullable(null).orElse("null"); System.out.println(rs); -- 输出结果 null 11、orElseGet() orElseGet 方法作用是如果实例包含非空值,返回这个值;否则,它会执行作为参数传入的Supplier函数式接口方法,并返回其执行结果。 Object result = Optional.ofNullable(null) .orElseGet(() -> { return "error"; }); System.out.println(result); -- 输出结果 error 12、orElseThrow() orElseThrow 方法作用是如果实例包含非空值,返回这个值;否则,它会执行作为参数传入的异常类。 Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("参数为空")); -- 输出结果 Exception in thread "main" java.lang.RuntimeException: 参数为空 at com.x.x.x.x.OptionalTest.lambda$main$10(OptionalTest3.java:144) at java.util.Optional.orElseThrow(Optional.java:290)
以上就是 JDK8 新增的Optional类的常用方法总结,其中ofNullable、map和orElse方法搭配使用的最多。
另外orElse、orElseGet、orElseThrow区别如下:
orElse:如果实例包含空值,返回传入指定的值
orElseGet:如果实例包含空值,返回传入的方法中返回值
orElseThrow:如果实例包含空值,返回指定的异常类型
在实际使用的时候,还得结合具体的场景进行合理选择,有时候并不是全部采用Optional来解决NPE异常代码才更加优雅,比如当前对象比较简单,就是一个简单判断,通过obj != null足以解决问题。
因此在保证业务功能的正确和稳定性的基础之上,适当的选择相关的工具来优化代码的整洁度和可读性,更能发挥出锦上添花的效果!
关注"都市百货" 了解南陵
微信咨询wanglf2r(不拉群 发广告者勿加)
热门评论