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

yizhihongxing

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日

相关文章

  • Spring Boot 优雅整合多数据源

    下面是 Spring Boot 优雅整合多数据源的完整攻略。 1. 背景 Spring Boot 为我们提供了非常便捷的开发方式,但在项目中使用多数据源时,代码会变得比较冗长和难以维护。所以,需要一种更加简洁优美的方式来整合多数据源。 2. 实现方式 Spring Boot 优雅整合多数据源的方式,主要是通过使用 Spring 自带的 AbstractRou…

    Java 2023年5月20日
    00
  • Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

    下面是关于“Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识”的完整攻略,包含两个示例说明。 Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识 在本文中,我们将介绍MyBatis的基础知识,包括配置文件、映射器和SQL语句等。 步骤1:添加依赖 首先,我们需要在pom…

    Java 2023年5月17日
    00
  • mybatis实现获取入参是List和Map的取值

    对于MyBatis,我们可以通过Mapper接口的方法的入参类型来传递参数。如果我们需要传递List或者Map类型的参数,该如何处理呢?下面我们来一一讲解。 传递List类型的参数 当我们需要将一个List类型的参数传递给Mapper接口的方法时,我们可以采用@Param注解的方式将参数进行命名,如下所示: public interface UserMapp…

    Java 2023年5月20日
    00
  • SpringBoot+Vue项目新手快速入门指南

    SpringBoot+Vue项目新手快速入门指南 SpringBoot和Vue是两个非常流行的开发框架,它们可以帮助我们快速构建高效、可靠的Web应用程序。在本文中,我们将介绍如何使用SpringBoot和Vue构建一个完整的Web应用程序。 步骤一:创建SpringBoot项目 我们首先需要创建一个SpringBoot项目。以下是一个示例: 打开Intel…

    Java 2023年5月15日
    00
  • Spring Boot运行部署过程图解

    下面详细讲解一下“SpringBoot运行部署过程图解”的完整攻略。 简介 SpringBoot是基于Spring Framework的一款开源框架,目前已成为Java领域中的热门框架之一。SpringBoot的优势在于它可以快速简单的创建一个独立运行的、生产级别的Spring应用,而不需要以前的一些繁琐的配置。本文将介绍SpringBoot的运行部署过程,…

    Java 2023年5月15日
    00
  • 云服务器(Linux)安装部署Kafka的详细过程

    云服务器(Linux)安装部署Kafka的详细过程 作为一种分布式消息系统,Kafka 可以快速处理大规模的实时数据。在云服务器中进行 Kafka 的部署和安装,可以更加方便地管理和维护 Kafka 的使用。 1. 安装 Java 环境 由于 Kafka 是基于 Java 编写的,因此在开始安装 Kafka 之前,需要先安装 Java 环境(JDK 8 或以…

    Java 2023年5月20日
    00
  • Springboot实现多线程注入bean的工具类操作

    下面详细讲解“Springboot实现多线程注入bean的工具类操作”的完整攻略: 一、背景 在使用Springboot开发项目时,我们经常需要使用到多线程。例如,爬虫、定时任务等都需要用到多线程。然而,在多线程环境下使用Spring的bean,需要使用特殊的技巧才能保证线程安全。本文将介绍如何用Springboot实现多线程注入bean的工具类操作。 二、…

    Java 2023年5月26日
    00
  • Java多种方式实现生产者消费者模式

    实现生产者消费者模式是 Java 多线程编程中的一个重要概念。在多线程环境下,生产者和消费者可以并行执行,提高了程序的效率。这里将详细讲解 Java 多种方式实现生产者消费者模式的完整攻略。 1. 管程法 管程法是最常用的实现生产者消费者模式的方法之一。它要求生产者和消费者共享同一个缓冲区,由缓冲区提供同步的方法供生产者和消费者调用。 以下是管程法的实现示例…

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