快速掌握Java8中的Optional

 更新时间:2023年07月13日 11:51:10   作者:偏爱星雾缠绕15  
Optional 是一个容器类,代表一个值存在或不存在,Optional并不是用来替换所有的null,而是为了在设计良好的API中更明确地表达可能缺失的值,这篇文章主要介绍了Java8的Optional及使用,需要的朋友可以参考下

自从Java 8在2014年发布以来,它引入了很多有用的特性,其中之一就是Optional类。这个类被设计成Java语言的一个解决方案,用于解决空指针异常(NullPointerException),这是Java开发者们面临的常见问题之一。在这篇博客中,我们将深入探讨Java的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还支持链式方法调用,如mapflatMap,这使得它能够和Java 8的其他特性如Streamlambda表达式一起更好地工作:

map 和 flatMap

mapflatMap 方法在函数式编程中用得非常广泛,它们也在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,而是为了在设计良好的API中更明确地表达可能缺失的值。通过明晰地表示"值可能不存在",Optional可以帮助我们设计更清晰、更易于理解的API,从而减少Bug的出现率。

到此这篇关于Java8的Optional的文章就介绍到这了,更多相关Java8的Optional内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Struts2实现文件上传功能实例解析

    Struts2实现文件上传功能实例解析

    这篇文章主要介绍了Struts2实现文件上传功能实例解析,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • springboot+vue 若依项目在windows2008R2企业版部署流程分析

    springboot+vue 若依项目在windows2008R2企业版部署流程分析

    这篇文章主要介绍了springboot+vue 若依项目在windows2008R2企业版部署流程,本次使用jar包启动后端,故而准备打包后的jar文件,需要的朋友可以参考下
    2022-12-12
  • kotlin之闭包案例详解

    kotlin之闭包案例详解

    这篇文章主要介绍了kotlin之闭包案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 关于spring5的那些事:@Indexed 解密

    关于spring5的那些事:@Indexed 解密

    这篇文章主要介绍了关于spring5的那些事:@Indexed 解密,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java集合List的使用详细解析

    Java集合List的使用详细解析

    这篇文章主要介绍了Java集合List的使用详细解析,List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引,鉴于Java中数组用来存储数据的局限性,我们通常使用java.util.List替代数组,需要的朋友可以参考下
    2023-11-11
  • SpringBoot 枚举类型的自动转换的实现

    SpringBoot 枚举类型的自动转换的实现

    一般我们在数据库都会定义数值型的枚举常量,不管是序列化还是反序列化都是需要我们手动去转换成枚举类型的,本文主要介绍了Spring Boot 枚举类型的自动转换,感兴趣的可以了解一下
    2022-03-03
  • Java C++解决在排序数组中查找数字出现次数问题

    Java C++解决在排序数组中查找数字出现次数问题

    本文终于介绍了分别通过Java和C++实现统计一个数字在排序数组中出现的次数。文中详细介绍了实现思路,感兴趣的小伙伴可以跟随小编学习一下
    2021-12-12
  • springboot使用ThreadPoolTaskExecutor多线程批量插入百万级数据的实现方法

    springboot使用ThreadPoolTaskExecutor多线程批量插入百万级数据的实现方法

    这篇文章主要介绍了springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Elasticsearch中store field与non-store field的区别说明

    Elasticsearch中store field与non-store field的区别说明

    这篇文章主要介绍了Elasticsearch中store field与non-store field的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot 整合Tess4J库实现图片文字识别案例详解

    SpringBoot 整合Tess4J库实现图片文字识别案例详解

    Tess4J是一个基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本,说白了,就是封装了它的API,让Java可以直接调用,今天给大家分享一个SpringBoot整合Tess4j库实现图片文字识别的小案例
    2023-10-10

最新评论