Java8之Optional简介说明
下文笔者讲述java8中Optional的简介说明,如下所示
Optional简介
Optional是一个容器类
常指一个值存在或不存在
由于java中没有空安全类型,任何对象都可能出现null
从而导致NullPointerException异常
即Optional出现使
我们可以更好的处理null值
下文笔者将依次讲述Optional的相关操作简介说明,如下所示
创建Optional对象
创建一个非空的Optional
// 使用of方法创建包含值的Optional。参数不能为null,否则会立即抛出NullPointerException。
Optional<String> optional = Optional.of("Hello World");
创建一个可能为空Optional
// 使用ofNullable方法创建可以包含null的Optional 当参数为null 它将创建一个空Optional对象 Optional<String> optionalNullable = Optional.ofNullable(null);
访问Optional对象值
使用get()方法
获取Optional值
当Optional为空则抛出NoSuchElementException异常
String value = optional.get();
使用isPresent()方法来检查Optional是否有值
// isPresent方法用于检查Optional实例中是否包含非null值。
if (optional.isPresent()) {
System.out.println("Value found - " + optional.get());
}
使用ifPresent()方法进行更优雅的检查和使用
// ifPresent方法接收一个Consumer(消费者)参数
仅当Optional中有值存在时,才执行传入的Lambda表达式(或方法引用)。
optional.ifPresent(value -> System.out.println("Value found - " + value));
在Optional为空的时候提供一个备用值
可使用orElse()方法
// orElse方法允许在Optional对象不包含值时提供一个备选值。
String nullDefault = optionalNullable.orElse("Default Value");
System.out.println(nullDefault); // 输出:Default Value
或
使用orElseGet()方法进行延迟计算备用值
String value = optional.orElseGet(() -> "default value");
链式调用Optional
Optional支持链式方法调用 如map和flatMap 使得它能够和Java 8其他特性 如: Stream和lambda表达式一起更好地工作
map和flatMap
map和flatMap方法
在函数式编程中用得非常广泛
在Optional中被定义:
// 假设有一个方法parse(String str),str可能为null,解析后的结果也可能为null
Optional<String> str = Optional.ofNullable(getStr());
// 不使用map,我们需要进行两次null检查
if(str != null){
String result = parse(str);
if(result != null){
System.out.println(result);
}
}
// 使用Optional和map,可以避免显示null检查
str.map(this::parse).ifPresent(System.out::println);
注意
map操作需要Function作为参数
方法不能返回Optional类型
如果你要返回Optional
你应该使用flatMap
否则你会得到套装的Optional
// 使用map,你会得到Optional<Optional<Integer>>
Optional<Optional<Integer>> nestedOptional = str.map(this::parseToOptional);
// 使用flatMap,你会得到Optional<Integer>
Optional<Integer> flatOptional = str.flatMap(this::parseToOptional);
filter
filter方法与Stream中的filter类似 接收Predicate参数 用于测试Optional中是否有值符合给定的条件 Optional<String> filtered = str.filter(val -> val.length() > 3); // 如果Optional中的值长度大于3,那么仍旧返回包含该值的Optional // 否则返回一个空的Optional实例
Optional并不是用来替换所有的null 将会减少Bug的出现
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


