Java Optional实践(小结)

Java Optional实践(小结)

什么是Java Optional?

OptionalJava 8 引入的一个新特性,可以作为一种容器,对空值的处理提供更为优美的解决方案。

通常情况下我们在使用 Java 的时候经常会遇到 NullPointerException,就比如一个变量为 null,我们调用其方法时就可能会抛出该异常。而 Optional 就是解决这一问题的。它在包装对象的同时,判断其值是否为 null,并将其包装在一个容器中。如果该值为 null,那么程序能够更加优雅的处理这种情况。

如何使用Java Optional?

Optional的创建

Optional 的创建方式有多种,最常用的方式是使用 ofNullable()of() 方法:

// 创建一个值为 null 的 Optional
Optional<String> optional1 = Optional.ofNullable(null);
// 创建一个值不为 null 的 Optional
Optional<String> optional2 = Optional.of("test");

Optional的常用方法

  1. isPresent() :判断 Optional 是否包含非空值。

java
Optional<String> optional = Optional.ofNullable("test");
boolean isPresent = optional.isPresent();

  1. orElse() :如果 Optional 包含非空值,返回该值,否则返回指定的默认值。

java
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElse("默认值");

  1. orElseGet() :如果 Optional 包含非空值,返回该值,否则返回通过 supplier 提供的默认值。

java
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElseGet(() -> "通过supplier提供的默认值");

  1. orElseThrow() :如果 Optional 包含非空值,返回该值,否则抛出指定的异常。

java
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElseThrow(IllegalArgumentException::new);

  1. ifPresent() :如果 Optional 包含非空值,则使用 consumer 对其进行处理。

java
Optional<String> optional = Optional.ofNullable("test");
optional.ifPresent(value -> System.out.println(value));

Optional的应用场景

使用 Optional 的主要目的是为了解决 null 带来的问题,特别是在以下情境使用 Optional 可以带来更为可读且结构较好的代码:

  1. 返回值为 null 的情况。

在调用一些方法的时候,返回值可能为 null,这时候就可以使用 Optional 来包装返回值:

java
public Optional<String> getValue(int i) {
if (i == 0) {
return Optional.empty();
}
return Optional.of("test");
}

  1. 处理集合中的 null 值。

在遍历一个集合时可能会出现其中某个元素值为 null,而这时候通过if (value == null) 的方式处理不够优雅。这时候可以借助 Optional 来处理:

java
List<String> list = Arrays.asList("hello", "world", null, "optional");
list.stream().filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println);

示例说明

示例1:使用Optional解决空指针异常

以下是解决空指针异常的简单例子。在该例子中,Company 类中包含了一个员工对象 employee,而该对象有可能为空。在传统的方式下我们通常需要添加一个判断,增加代码的复杂度。而通过使用 Optional,我们可以更加简洁地处理这一情况:

public class Company {
   private Employee employee;

   public Optional<Employee> getEmployee() { 
       return Optional.ofNullable(employee);
   }
}

public class Employee {
   private String name;

   public String getName() {
       return name;
   }
}

Optional<Company> companyOptional = Optional.of(new Company());
String name = companyOptional.flatMap(Company::getEmployee)
                        .map(Employee::getName)
                        .orElse("Unknow");

示例2:使用Optional处理集合中的null

以下是使用 Optional 处理集合中的 null 值的例子。在下面的例子中我们使用了 Optional 来避免了集合中的 null 值带来的 NullPointerException

public class Person {
   private String name;

   public Person(String name) {
       this.name = name;
   }

   public String getName() {
       return name;
   }
}

List<Person> persons = Arrays.asList(new Person("test1"),
                                     new Person("test2"),
                                     new Person(null));
persons.stream().map(optional(Person::getName)).forEach(System.out::println);

在上面的例子中,我们通过 map 方法将 Optional 应用到每个元素上,如果元素不是 null,则将其的名字输出;否则,输出 "Unknow"。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Optional实践(小结) - Python技术站

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

相关文章

  • JSP验证码简单生成方法

    当我们网站需要进行用户登录、注册等操作时,我们通常需要使用验证码来防止机器人或者是恶意攻击,本文就来详细讲解一下如何使用JSP生成验证码。 一、验证码的生成方法 验证码的生成方法可以大致划分为以下步骤: 生成随机字符串 将随机字符串绘制成图片 将图片输出到网页上并传输随机字符串的值到后台进行验证 二、实现步骤 1. 生成随机字符串 使用Java的Random…

    Java 2023年6月15日
    00
  • java多线程编程制作电子时钟

    Java 多线程电子时钟制作攻略 一、准备工作 在开始制作电子时钟之前,需要完成以下准备工作: 安装并配置 Java 开发环境。 了解 Java 多线程编程的基本原理和语法。 二、电子时钟的制作步骤 1.定义一个继承 Runnable 接口的类,并实现 run() 方法。在此方法内编写时钟新增一个秒钟和输出时间的方法。 示例代码如下: class Clock…

    Java 2023年5月18日
    00
  • JVM调优笔记(一)–Nacos GC引发的服务批量下线问题

    故障背景 线上批量发服务下线的告警邮件,偶发nacos连接超时。采用了spring boot admin(以下称sba)进行服务监控。 原因分析 因为sba服务是基于nacos对其它服务进行监控,所以遇到这个问题,第一怀疑对象是nacos发生问题,但不清楚具体是什么问题。由于服务过一段事件会恢复,所以nacos肯定是没有挂掉的,那么排查方向应该是针对naco…

    Java 2023年4月23日
    00
  • Bootstrap和Java分页实例第一篇

    首先,该攻略主要针对的是Bootstrap和Java分页实例的基础入门教程,对于前端和Java开发初学者非常实用。文本将分为以下几个部分进行讲解: 一、Bootstrap的基础使用 1.1 引入Bootstrap到项目中 在使用Bootstrap进行开发时,首先需要在项目中引入Bootstrap的CSS和JS文件,这可以通过CDN链接或者下载本地文件的方式引…

    Java 2023年6月15日
    00
  • JAVA实现空间索引编码——GeoHash的示例

    想要详细讲解“JAVA实现空间索引编码——GeoHash的示例”的完整攻略,可以按照以下步骤进行: 1. 了解GeoHash GeoHash是一种基于经纬度坐标存储和索引的编码方式,将二维的经纬度坐标转换为字符串形式进行存储,以达到快速空间索引的目的。在GeoHash编码中,每个字符对应的是一段矩形区域,在进行空间查询的时候,只需要将查询范围转化为对应的Ge…

    Java 2023年5月20日
    00
  • 什么是线程安全的并发容器?

    以下是关于线程安全的并发容器的完整使用攻略: 什么是线程安全的并发容器? 线程安全并发容器是指在多线程环境下,多个线程可以同时访问容器中的元素,而不会出现数据不一致或程序崩溃等问题。在多线程编程中,线程安全的并发容器是非常重要的,因为多个线程同时访问容器,会出现线程争用的问题,导致数据不一致或程序崩溃。 如何实现线程安全的并发容器? 为了实现线程安全的并发容…

    Java 2023年5月12日
    00
  • Spring-webflux 响应式编程的实例详解

    Spring-webflux 响应式编程的实例详解 响应式编程的概念 响应式编程是一种处理异步数据流的编程范式,其主要思想是通过数据流的变化来触发相应的操作。这种编程模型可以帮助我们更加高效地处理并发、I/O密集型的操作,对于微服务架构的实现尤其有帮助。 Spring-webflux概述 Spring-webflux是基于响应式编程的Spring框架的一个子…

    Java 2023年6月3日
    00
  • 详解JSONObject和JSONArray区别及基本用法

    详解JSONObject和JSONArray区别及基本用法 1. JSONObject和JSONArray是什么? 在Java中,JSONObject和JSONArray都是JSON格式数据的提供者。 JSONObject对象表示一个JSON对象,即类似于{ “name”: “张三”, “age”: 18, “gender”: “male” }这样的数据结构…

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