Optional 类

2024-06-03 00:04
文章标签 optional

本文主要是介绍Optional 类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

到目前为止,臭名昭著的空指针异常是导致 Java 应用程序失败的最常见原因。以前,为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类, Guava 通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到 Google Guava 的启发,Optional 类已经成为 Java 8 类库的一部分。

Optional<T> 类(java.util.Optional)是一个容器类,它可以保存类型 T 的值,代表这个值存在。或者仅仅保存 null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

Optional 类的 Javadoc 描述如下:这是一个可以为 null 的容器对象。如果值存在则 isPresent() 方法会返回 true,调用 get() 方法会返回该对象。

Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。

我们先来看一段代码:

public static String getGender(Student student){if(null == student) {return "Unkown";}return student.getGender();
}

这是一个获取学生性别的方法,方法入参为一个 Student 对象,为了防止 student 对象为 null, 做了防御性检查:如果值为 null,返回 “Unkown”。
再看使用 Optional 优化后的方法:

public static String getGender(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
}

可以看到,Optional 类结合 lambda 表达式 的使用能够让开发出的代码更简洁和优雅。

创建 Optional 类对象的方法

我们看下 Optional 类的部分源码:

private static final Optional<?> EMPTY = new Optional<>();private final T value;private Optional() {this.value = null;
}public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;
}private Optional(T value) {this.value = Objects.requireNonNull(value);
}public static <T> Optional<T> of(T value) {return new Optional<>(value);
}public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}
  • Optional.of(T t):创建一个 Optional 实例,t 必须非空。
  • Optional.empty():创建一个空的 Optional 实例。
  • Optional.ofNullable(T t):t 可以为 null。

判断 Optional 容器中是否包含对象

  • boolean isPresent():判断是否包含对象。

  • void ifPresent(Consumer<? super T> consumer):如果有值,就执行 Consumer 接口的实现代码,并且该值会作为参数传给它。部分源码:

  • public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);
    }
  • 示例:

    public static void printName(Student student) {Optional.ofNullable(student).ifPresent(u ->  System.out.println("The student name is : " + u.getName()));
    }

  • 上述示例用于打印学生姓名,由于 ifPresent() 方法内部做了 null 值检查,调用前无需担心 NPE(NullPointerException) 问题。

获取 Optional 容器的对象

  • T get():如果调用对象包含值,返回该值,否则抛异常。

  • T orElse(T other):如果有值则将其返回,否则返回指定的 other 对象。部分源码:

  • public T orElse(T other) {return value != null ? value : other;
    }

  • 示例:
     

    public static String getGender(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
    }
  • T orElseGet(Supplier<? extends T> other):如果有值则将其返回,否则返回由 Supplier 接口实现提供的对象。部分源码:

  • public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();
    }

  • 示例:
     

    public static String getGender(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown");      
    }
  • T orElseThrow(Supplier<? extends X> exceptionSupplier):如果有值则将其返回,否则抛出由 Supplier 接口实现提供的异常。

    示例:
     

    public static String getGender1(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown"));      
    }

这篇关于Optional 类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025473

相关文章

JAVA 中的Optional类详解

JAVA 中的Optional类详解 一、引言 Java 8 引入了 Optional 类,旨在提供一种更优雅的方式来处理可能为 null 的情况,从而避免 NullPointerException。Optional 是一个容器对象,它可能包含也可能不包含非空值。使用 Optional 可以显著减少代码中的 null 检查,使代码更加简洁和安全。 二、Optional 类的基本概念 1、创

用Optional后代码变清爽多了

前言 编程路上风雨兼程,踩过的坑比喝过的奶茶还要多几分回味。今天,咱们深入浅出,探讨一个既平凡又深奥的操作——判空艺术,特别是那经典桥段 != null。在与臭名昭著的 NullPointerException(简称NPE,程序界的“空指针噩梦”)的持久战中,这招几乎是程序员的护身法宝。 想当年,我还是编程界的新兵蛋子,对 null 敏感得像雷达,逢 null 必严谨判空,if (某物 !=

Java8新特性-Optional的使用

写在前面 最开始学java的时候,总能听到别人说java8的新特性,比如lambda表达式,stream流等等。但是第一次接触Optional是在公司前辈的代码中看到的。最开始我还以为是公司自己的工具类,也没太注意。后来才知道他也是java8最重要的一个特性。 关于Optional 简单来说Optional就是解决空指针异常(NullPointerException)的一个类。在平时的代码中

JDK8新特性之Optional快速入门

目录标题 1、创建Optional对象2、值为空时Optional提供的else操作3、map()转换的操作4、isPresent()和ifPresent()判断值是否为空5、filter()过滤值 作为程序猿一定会遇到NullPointerException异常,简称NPE,随之而来的就是为空判断if else。逻辑稍微复杂点,代码就显得不好看了。比如: public Stri

标准库标头 <optional> (C++17)学习之optional

类模板 std::optional 管理一个可选 的所含值,即既可以存在也可以不存在的值。 一种常见的 optional 使用情况是作为可能失败的函数的返回值。与如 std::pair<T, bool> 等其他手段相比,optional 可以很好地处理构造开销高昂的对象,并更加可读,因为它明确表达了意图。 optional<T> 的任何实例在任意给定时间点要么含值,要么不含值。 如果一个

Java 8中Optional类

文章目录 引言概述创建Optional对象Optional.ofOptional.ofNullableOptional.empty 操作Optional对象检查值是否存在:isPresent与isEmpty获取值:get方法获取值(提供默认值):orElse、orElseGet、orElseThrow消费值:ifPresent与ifPresentOrElse Optional高级操作转换与映

java.util.Optional.or() .orElse(), .orElseGet()的区别

java.util.Optional 是 Java 8 引入的一个容器类,用于表示一个可能包含或不包含非空值的对象。它提供了多种方法来处理可能为空的对象,从而避免使用null值。 在 Optional 中,.or(), .orElse(), 和 .orElseGet() 都是用于处理可能为空的值的方法,但是它们的行为和使用场景有所不同。 1. Optional.or(Supplier<? ex

【JDK8之旅】——Optional

我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代码就开始这么写了 Optional<User> user = ......if (user.isPresent()) {return user.getOrders();} else {return

Java的Optional类——解决空指针异常的好工具

java.util.Optional 类是 Java 8 引入的一个容器对象,旨在解决空指针异常的问题。Optional 类提供了一种优雅的方式来处理可能为 null 的值,从而避免了显式的 null 检查。这对于提高代码的可读性和减少空指针异常非常有用。 Optional 类的基本用法 构造:不能直接使用 new Optional() 创建 Optional 对象,因为它的构造器是私有的。