Java8中的Optional类型

Introduction

在Java 8之前,如果我们需要在代码中表示一个值可能为空的情况,我们唯一能做的就是将它设置为null。然而,这种方式是非常容易出bug的。在Null指针异常(NullPointerException)的问题中,Java 语言有一个了不起的产物叫 Optional.

正文

Optional的概念

Java 8引入了一个Optional类,建议使用 Optional 类来表示一个值存在或不存在。这个对象可以包含非空的对象(存在),或者NULL(不存在)。使用 Optional 的目的不是去除 null,而是提供了一种可变空值类型,使得程序员可以更加注意程序中可能会出现的 null值,这有助于减少NullpointerException的发生。

什么是Optional?

Optional是一个简单的容器类,它可以代表一个值存在或不存在,而不是使用null值来表示“没有值”这种情况。这样可以避免大量的if(foo!=null)这样的代码,并且在某种程度上提高了代码的可读性。Java 8的这个特性已经被其它很多语言借鉴了。

Optional的运用

我们可以通过下面的方式创建 Optional 对象:

Optional optional = Optional.of("Hello World");

或者我们要在一个方法中返回一个对象时,我们可以这样写:

public Optional getCustomObject() {
    if(condition == true) {
        return Optional.of(new CustomObject());
    } else {
        return Optional.empty();
    }
}

该方法可以避免返回值为null这种情况,并且可以在返回时立即知道返回值是否存在。

Optional的API

在 Optional 类中,包含很多有用的方法,这里我们只介绍其中一些。

isPresent() 和 get()

isPresent(): 如果值存在返回true,否则返回false。

get(): 如果Optional有值则将其返回,否则抛出NoSuchElementException。

Optional optional = Optional.of("Hello World");

if(optional.isPresent()) {
    System.out.println(optional.get()); // 输出: Hello World
}

orElse()

如果有值则将其返回,否则返回一个默认值。

Optional optional = Optional.empty();

System.out.println(optional.orElse("Hello World")); // 输出: Hello World

orElseGet()

orElseGet()方法与orElse()方法非常相似,但其中一个区别是提供用于计算默认值的Supplier。

Optional optional = Optional.empty();

Supplier supplier = () -> "Hello World";

System.out.println(optional.orElseGet(supplier)); // 输出: Hello World

orElseThrow()

orElseThrow() 方法与orElse() 方法和 orElseGet() 方法类似,但是抛出的是传入的异常类型。

Optional optional = Optional.empty();

try {
    System.out.println(optional.orElseThrow(Exception::new)); // 抛出异常: Exception
} catch (Exception e) {
    e.printStackTrace();
}

map()

如果有值,则对其执行调用mapping函数得到返回值。否则返回 Optional.empty()。

Optional optional = Optional.of("Hello World");

Optional upperOptional = optional.map(String::toUpperCase);

System.out.println(upperOptional.get()); // 输出: HELLO WORLD

flatMap()

flatMap() 方法与 map() 方法类似,区别在于 flatMap 中的 mapping 函数返回值必须是 Optional。

Optional optional = Optional.of("Hello World");

Function<String, Optional> function = s -> Optional.of(s.toUpperCase());

Optional flatMapOptional = optional.flatMap(function);

System.out.println(flatMapOptional.get()); // 输出: HELLO WORLD

小结

Optional提供了一个比null更好的方式来表示一个值不存在的情况。如果我们使用得当,它可以帮助我们避免NullPointException的发生。

整篇文章都着重于让大家了解Optional是什么,它们如何工作,以及为什么对代码质量有所帮助。记住,在正确地使用Optional时,代码将更具可读性,更加健壮。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/246538.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:15
下一篇 2024-12-12 13:15

相关推荐

  • int类型变量的细节与注意事项

    本文将从 int 类型变量的定义、声明、初始化、范围、运算和类型转换等方面,对 int 类型变量进行详细阐述和讲解,帮助读者更好地掌握和应用 int 变量。 一、定义与声明 int…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python基本数字类型

    本文将介绍Python中基本数字类型,包括整型、布尔型、浮点型、复数型,并提供相应的代码示例以便读者更好的理解。 一、整型 整型即整数类型,Python中的整型没有大小限制,所以可…

    编程 2025-04-29
  • Python中的Bool类型判断

    本篇文章旨在讲解Python中的Bool类型判断。在Python中,Bool类型是经常使用的一种类型,因此掌握其用法非常重要。 一、True和False 在Python中,True…

    编程 2025-04-29
  • Python函数类型有哪些

    本文将从以下几个方面详细阐述Python函数类型。 一、内置函数 Python的内置函数是指在Python编程语言中提供的可以直接使用的函数,不需要通过导入模块等方式引入。 部分常…

    编程 2025-04-29
  • Python中的整数类型int类总览

    本文将从多个方面,对Python中的整数类型int类进行全面介绍和阐述。 一、数据类型及基本操作 在Python中,整数类型的数据类型为int。在Python3.x中,整数类型的范…

    编程 2025-04-28
  • Python变量类型用法介绍

    Python是一种解释型编程语言,它提供了丰富的数据类型,包括数字、字符串、列表、元组、集合、字典等。Python变量类型的定义是Python程序开发的基础,本文将从以下几个方面对…

    编程 2025-04-28
  • Python查询变量类型的函数

    本文将从多个方面详细阐述Python中查询变量类型的函数,主要包括以下几点: 一、type()函数 type()函数是Python内置的函数,用于查询变量的类型。它的使用非常简单,…

    编程 2025-04-28
  • 为什么Python函数定义中没有对参数指定类型?

    Python是一种强类型语言,也就是说语言本身会强制要求变量的类型。但是在Python函数定义中,却没有要求对参数指定类型。这是为什么呢? 一、简化函数定义 Python语言简单明…

    编程 2025-04-28
  • Python语言列表中的元素类型可以不相同

    Python语言的列表是一种有序的集合,可以包含任意数量和任意类型的Python对象,包括数字、字符串甚至是其他列表对象,这样的特性称为Python语言列表中的元素类型可以不相同。…

    编程 2025-04-28

发表回复

登录后才能评论