Java8中新判空方法之Optional类的使用详解

Java8新判空方法之Optional类的使用详解

简介

在Java8中,我们可以使用Optional类来优雅地处理 null 值的情况。 Optional 是一个容器对象,可能包含可null 可非null 的值。使用 Optional类,我们可以减少代码中出现的nullPointerException异常,从而使代码更加优雅。

Optional类的使用方式

创建Optional对象

创建 Optional 对象的方式如下:

Optional<String> optionalString1 = Optional.empty();         //创建一个空的 Optional 对象
Optional<String> optionalString2 = Optional.of("hello");      //创建一个包含初始值的 Optional 对象,初始值不能为null
Optional<String> optionalString3 = Optional.ofNullable(null); //创建一个包含初始值的 Optional 对象,初始值允许为null
  • empty() 创建一个空的 Optional 对象。
  • of(Object obj) 创建一个包含初始值的 Optional 对象,初始值必须为非null。
  • ofNullable(Object obj) 创建一个包含初始值的 Optional 对象,初始值可以为null。

判断Optional对象是否存在值

使用ifPresent()方法或者isPresent()方法,来判断 Optional 对象是否包含值,如下示例:

Optional<String> optionalString = Optional.of("hello");
if(optionalString.isPresent()){
    System.out.println(optionalString.get());   //输出:hello
}

获取Optional对象的值

  • 使用 get() 方法来获取 Optional 对象的值,但是在调用该方法之前,使用 isPresent() 方法先判断 Optional 对象是否存在值,防止返回 null 值。
Optional<String> optionalString = Optional.of("hello");
if(optionalString.isPresent()){
    System.out.println(optionalString.get());   //输出:hello
}
  • 使用 orElse() 方法获取 Optional 对象的值,如果 Optional 对象的值不为 null,则返回 Optional 对象的值;如果 Optional 对象的值为 null,则返回我们指定的默认值。
Optional<String> optionalString = Optional.ofNullable(null);
String result = optionalString.orElse("world");
System.out.println(result);      //输出:world
  • 使用 orElseGet() 方法获取 Optional 对象的值,如果 Optional 对象的值不为 null,则返回 Optional 对象的值;如果 Optional 对象的值为 null,则调用 Supplier 函数式接口来获取默认值。
Optional<String> optionalString = Optional.ofNullable(null);
String result = optionalString.orElseGet(() -> "world");
System.out.println(result);      //输出:world
  • 使用 orElseThrow() 方法在 Optional 对象的值为 null 时,抛出指定的异常。
Optional<String> optionalString = Optional.ofNullable(null);
String result = optionalString.orElseThrow(NullPointerException::new);

使用map()和flatMap()方法获取Optional对象中的值

使用 map() 和 flatMap() 方法来获取 Optional 对象中的值,这两个方法可以优雅地处理 null 值的情况。

  • 使用 map() 方法来将 Optional 对象中的值进行转换,如果 Optional 对象的值为 null,则返回一个空的 Optional 对象。
Optional<String> optionalString = Optional.of("hello");
Optional<Integer> optionalInteger = optionalString.map(String::length);
System.out.println(optionalInteger.get());   //输出:5
  • 使用 flatMap() 方法来将 Optional 对象中的值进行转换,如果 Optional 对象的值为 null,则返回一个空的 Optional 对象。
Optional<String> optionalString = Optional.of("hello");
Optional<Integer> optionalInteger = optionalString.flatMap(str -> Optional.of(str.length()));
System.out.println(optionalInteger.get());   //输出:5

示例

下面通过两个例子说明 Optional 类的使用。

//示例1:正常情况下的传统代码
String str = "hello";
if(str != null){
    System.out.println(str.length());
}

//使用 Optional 类优雅地处理 null 值
Optional<String> optionalStr = Optional.ofNullable("hello");
int length = optionalStr.map(String::length).orElse(0);
System.out.println(length);
//示例2:在Lambda表达式中使用 Optional 类
List<String> list = Arrays.asList("hello", null, "world");
list.stream()
    .filter(val -> Optional.ofNullable(val).isPresent())
    .map(val -> val.toUpperCase())
    .forEach(System.out::println);

总结

使用 Optional 类可以避免代码中出现空指针异常,使代码更加优雅、简单。建议在 Java8 及以上版本的开发中,使用 Optional 类优雅地处理 null 值的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java8中新判空方法之Optional类的使用详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Springboot项目实现Mysql多数据源切换的完整实例

    下面是完整的攻略说明: 1. 前言 在实际开发中,一个服务可能需要涉及多个数据库,为了不同的业务之间数据互不干扰,我们需要对不同的业务使用不同的数据库。Spring Boot提供了良好的支持,使得我们很容易地实现多数据源切换。本文将介绍如何使用Spring Boot来实现Mysql多数据源切换。 2. 配置多数据源 在Spring Boot中,要使用多数据源…

    Java 2023年5月20日
    00
  • java 反射机制详解及实例代码

    Java反射机制详解 Java反射机制是指在运行时使用Reflection API动态获取类信息、构造对象、调用方法、访问属性等。反射机制在框架开发、ORM映射、动态代理、JavaBean工具、JUnit单元测试等领域有着广泛的应用。 反射机制的特性 Java反射机制具有以下特性: 运行时类型信息:反射机制可以获取类的各种信息,例如类名、父类、接口、方法、属…

    Java 2023年5月23日
    00
  • Disruptor-源码解读

    前言 Disruptor的高性能,是多种技术结合以及本身架构的结果。本文主要讲源码,涉及到的相关知识点需要读者自行去了解,以下列出: 锁和CAS 伪共享和缓存行 volatile和内存屏障 原理 此节结合demo来看更容易理解:传送门 下图来自官方文档 官方原图有点乱,我翻译一下 在讲原理前,先了解 Disruptor 定义的术语 Event 存放数据的单位…

    Java 2023年4月17日
    00
  • Hibernate持久化对象生命周期原理解析

    Hibernate持久化对象生命周期原理解析——完整攻略 什么是Hibernate? Hibernate是一个Java持久化框架,可以将Java程序中的对象映射到关系型数据库中,使得程序员可以直接操作Java对象,而无需写SQL语句。 Hibernate中的对象生命周期 Hibernate中的对象生命周期分为四个状态:瞬时状态、持久化状态、游离状态、删除状态…

    Java 2023年5月19日
    00
  • Java8 Stream流的合并

    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在。 @Data @AllArgsConstructor public class Customer { private String name; private Stri…

    Java 2023年5月6日
    00
  • spring @Conditional的使用与扩展源码分析

    让我为您详细介绍“spring @Conditional的使用与扩展源码分析”的攻略。 什么是spring @Conditional @Conditional 是 Spring 中一种条件注解,可以根据满足指定的条件来决定是否创建这个 Bean。例如,可以使用 @Conditional 注解,根据不同的环境条件或者配置来创建不同的 Bean 实例。@Cond…

    Java 2023年5月19日
    00
  • MyBatis入门学习教程-MyBatis快速入门

    对于”MyBatis入门学习教程-MyBatis快速入门”,我们可以按照如下步骤来进行学习,包括环境搭建、对象映射、CRUD操作等内容。 一、环境搭建 下载MyBatis在MyBatis的官方网站上下载最新版本的MyBatis(https://github.com/mybatis/mybatis-3/releases),解压后将其中的mybatis-3.x.…

    Java 2023年5月20日
    00
  • Java+MySQL实现学生信息管理系统源码

    Java+MySQL实现学生信息管理系统 本文将介绍如何使用Java和MySQL数据库实现一个简单的学生信息管理系统,并提供完整的源码和演示。 准备工作 为了使用Java和MySQL实现学生信息管理系统,需要先进行以下准备工作: 安装Java开发环境(JDK) 安装MySQL数据库 安装Java连接MySQL的驱动程序(JDBC驱动) 在这里以Windows…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部