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日

相关文章

  • tomcat性能优化(性能总览)

    Tomcat性能优化(性能总览) 为了提高Tomcat的性能,可以考虑以下几个方面的优化: 1. 确定性能瓶颈 我们需要确定Tomcat的性能瓶颈。可以使用JProfiler等工具来对Tomcat进行性能分析和优化。通过分析Tomcat的CPU利用率、内存使用情况、I/O和网络延迟情况等指标,可以帮助我们定位性能瓶颈。 2. Tomcat服务器配置优化 2.…

    Java 2023年5月19日
    00
  • Spring Boot整合持久层之JdbcTemplate多数据源

    下面我将详细讲解Spring Boot整合持久层之JdbcTemplate多数据源的完整攻略。 1. 前置条件 在运行本教程的示例之前,需要确保以下条件已被满足: 已经安装了Java和Maven 已经安装了MySQL数据库,并且创建了至少两个数据库,命名为db1和db2,用户为root,密码为123456。 2. 引入依赖 首先需要在maven的pom.xm…

    Java 2023年6月2日
    00
  • Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法

    要在Spring MVC中配置双数据源来连接两个数据库,需要以下步骤: 添加数据库连接的相关依赖 需要在pom.xml文件中添加数据库的相关依赖,例如: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo…

    Java 2023年5月20日
    00
  • Java常用HASH算法总结【经典实例】

    以下是Java常用HASH算法总结【经典实例】的完整攻略。 简介 HASH算法是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。将消息转换为数字指纹,在计算机领域广泛应用。例如,在密码学中,我们可以对原始的密码消息应用哈希函数,得到一个固定长度的哈希值,用于保证数据的完整性和安全性。 常用HASH算法 Java中常用的HASH算法有MD5、SHA1、…

    Java 2023年5月19日
    00
  • FusionCharts图表显示双Y轴双(多)曲线

    要讲解“FusionCharts图表显示双Y轴双(多)曲线”,我们需要了解以下几个方面: FusionCharts的基本使用: FusionCharts是一种可以创建多种类型图表的强大JavaScript库。使用FusionCharts的步骤如下: 引入FusionCharts库文件; 创建一个用于显示图表的空间; 创建一个包含图表属性和数据的JSON对象;…

    Java 2023年6月15日
    00
  • java实现上传图片进行切割的方法

    下面我来详细讲解一下Java实现上传图片进行切割的方法。 1. 背景 在Web开发中,上传图片并对其进行切割是非常常见的操作。通常情况下,我们需要将大图片切割成多张小图片,以方便我们的页面显示。那么如何实现这样的功能呢? 2. 技术实现 2.1 文件上传 首先要实现的便是文件上传,可以采用常用的一些Java框架,如SpringMVC或Struts2来实现。 …

    Java 2023年5月20日
    00
  • 创建SpringBoot工程并集成Mybatis的方法

    创建SpringBoot工程并集成Mybatis,是一项非常常用的技术操作。本文将为大家详细讲解如何基于SpringBoot快速集成Mybatis的步骤和工具。 1.创建SpringBoot工程 SpringBoot提供了官方的SpringBoot CLI和SpringBoot Initializr两种工具,来创建SpringBoot工程。本文使用Sprin…

    Java 2023年5月19日
    00
  • Java数据类型的规则

    Java数据类型的规则 在 Java 中,每一个变量都有一个数据类型,数据类型决定了变量可以存储的数据类型和操作的方式。Java 中的数据类型可以分为两类:基本数据类型和引用数据类型。在使用数据类型时,需要遵守以下规则: 每个变量都必须有一个明确的数据类型,例如:int、double、String 等。 在声明变量时,可以指定其数据类型,并且变量的数据类型不…

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