Java 8中引入的Optional类详解,附示例代码:

夏侯存
• 阅读 408

Optional类是Java 8中引入的用于处理可能为null的值的容器类。它提供了一组方法来避免显式的null检查和处理,从而减少空指针异常的风险,并使代码更加简洁和可读。下面是关于如何使用Optional类的详细讲解。

  1. 创建Optional对象:
  • 使用Optional.of(value):创建一个包含非null值的Optional对象。如果传入的value为null,将会抛出NullPointerException。
  • 使用Optional.ofNullable(value):创建一个包含指定值的Optional对象,即使传入的value为null。
  1. 检查Optional对象中是否有值:
  • 使用isPresent()方法:判断Optional对象中是否存在非null值。如果存在,返回true;否则,返回false。
  1. 获取Optional对象中的值:
  • 使用get()方法:获取Optional对象中的非null值。如果Optional对象中没有值,将会抛出NoSuchElementException异常。因此,在调用get()方法之前,最好先使用isPresent()方法进行检查。
  1. 提供默认值:
  • 使用orElse(defaultValue)方法:如果Optional对象中有值,则返回该值;否则,返回提供的默认值defaultValue。
  • 使用orElseGet(supplier)方法:如果Optional对象中有值,则返回该值;否则,调用提供的Supplier函数生成一个默认值并返回。
  1. 抛出异常:
  • 使用orElseThrow(exceptionSupplier)方法:如果Optional对象中有值,则返回该值;否则,使用指定的异常生成函数exceptionSupplier抛出一个异常。
  1. 使用条件操作:
  • 使用ifPresent(consumer)方法:如果Optional对象中有值,则执行指定的操作consumer,否则不执行任何操作。
  • 使用filter(predicate)方法:如果Optional对象中有值,并且该值满足谓词predicate,返回一个包含该值的Optional对象;否则,返回一个空的Optional对象。
  • 使用map(function)方法:如果Optional对象中有值,则应用指定的函数function到该值,并返回一个包含结果的Optional对象;否则,返回一个空的Optional对象。
  • 使用flatMap(function)方法:类似于map()方法,但是要求函数function返回一个Optional对象。

使用Optional类可以使代码更具可读性和健壮性。它可以帮助我们更好地处理可能为null的值,避免了繁琐的null检查和处理,提供了一种优雅的方式来处理可能存在的值或者提供默认值或者抛出异常。然而,需要注意的是,过度使用Optional可能会使代码变得复杂,因此我们应该根据实际情况选择适当的使用Optional。

以下是一个使用Optional的代码示例:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        String value = "Hello, Optional!";

        // 创建Optional对象
        Optional<String> optional = Optional.of(value);

        // 判断值是否存在
        boolean isPresent = optional.isPresent();
        System.out.println("Is value present? " + isPresent);

        // 获取值
        String result = optional.get();
        System.out.println("Value: " + result);

        // 如果值存在,执行操作
        optional.ifPresent(val -> System.out.println("Length: " + val.length()));

        // 转换值
        optional.map(val -> val.toUpperCase())
                .ifPresent(upperCase -> System.out.println("Upper case value: " + upperCase));

        // 如果值不存在,提供默认值
        String defaultValue = optional.orElse("Default Value");
        System.out.println("Default Value: " + defaultValue);

        // 如果值不存在,执行操作获取默认值
        String computedValue = optional.orElseGet(() -> computeDefaultValue());
        System.out.println("Computed Value: " + computedValue);

        // 如果值不存在,抛出异常
        try {
            String resultOrThrow = optional.orElseThrow(() -> new RuntimeException("Value is required."));
            System.out.println("Result: " + resultOrThrow);
        } catch (RuntimeException e) {
            System.err.println("Exception: " + e.getMessage());
        }
    }

    private static String computeDefaultValue() {
        return "Computed Default Value";
    }
}

打印结果:

Is value present? true
Value: Hello, Optional!
Length: 16
Upper case value: HELLO, OPTIONAL!
Default Value: Hello, Optional!
Computed Value: Hello, Optional!
Result: Hello, Optional!

在上述代码中,我们首先创建一个Optional对象,使用Optional.of()方法将一个非空值封装到Optional中。然后,我们可以使用isPresent()方法判断值是否存在,使用get()方法获取值。

使用ifPresent()方法,我们可以在值存在时执行特定的操作。使用map()方法,我们可以对值进行转换。使用orElse()方法,我们可以在值不存在时提供默认值。使用orElseGet()方法,我们可以在值不存在时执行操作来获取默认值。使用orElseThrow()方法,我们可以在值不存在时抛出异常。

需要注意的是,如果使用Optional.of()方法封装一个可能为空的值,并且该值为空,则会抛出NullPointerException异常。如果值可能为空,可以使用Optional.ofNullable()方法来创建Optional对象,该方法会根据值是否为null来确定是否为空。

使用Optional可以提高代码的可读性和可维护性,避免了繁琐的空指针检查。然而,需要谨慎使用Optional,避免滥用,只在需要处理可能为空的值时使用。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
jdk8 optional
Optional是jdk1.8(新命名方式应该说JDK8)推出的解决空指针问题的类,解决空指针这个说法不是准确,应该说是方便简洁处理空指针问题吧。毕竟jdk8推出了很多新语言使java语言编写程序更加简洁。参考:https://www.jianshu.com/p/d81a5f7c9c4e(https://www.oschina.net/action
Optional源码解析与实践
1导读NullPointerException在开发过程中经常遇到,稍有不慎小BUG就出现了,如果避免这个问题呢,Optional就是专门解决这个问题的类,那么Optional如何使用呢?让我们一起探索一下吧!2源码解析
梦
4年前
微信小程序验证url地址
笔记类varthatthisthat.optional()是验证是否为空方法url(value){returnthat.optional(value)||/^(?:(?:(?:https?|ftp):)?//)(?:S(?::S)?@)?(?:
梦
4年前
微信小程序验证邮箱,验证手机号
笔记类varthatthisthat.optional()是验证是否为空方法/验证邮箱格式/email(value){returnthat.optional(value)||/^azAZ09.$%&'\/?^_{|}@azAZ
京东云开发者|深入JDK中的Optional
概述:Optional最早是Google公司Guava中的概念,代表的是可选值。Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染,另一方面,也使得领域模型中所隐藏的知识,得
梦
4年前
微信小程序验证身份证号
验证身份证号格式,笔记varthatthisthat.optional()是验证是否为空方法idcard(idCard){varregIdCardthat.optional(idCard)||/^19d{5}(18|19|(23d))d{2}((019)|(10|1
Wesley13 Wesley13
3年前
Object
nil用来给对象赋值NULL则给任何指针赋值    //NULL和nil不能互换,nil用于类指针赋值NSNull则用于集合操作一般情况下最好使用用nil(空对象值,有意义)\nil 任意方法\,不会导致崩溃NULL是一个通用指针(泛型指针,指向空指针)NSNull,NULL和nil在本质上应该
Wesley13 Wesley13
3年前
Java8(5):使用 Optional 处理 null
Java8(5):使用Optional处理null写过Java程序的同学,一般都遇到过NullPointerException:)——为了不抛出这个异常,我们便会写如下的代码:UserusergetUserById(id);if(user!
Easter79 Easter79
3年前
Spring异常处理
@ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度@ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离开@ResponseStatus:可以将某种异常映射为HTTP状态码@ControllerAdvicepublicclassExceptio
Wesley13 Wesley13
3年前
Java8 Optional && Guava Optional
Java8OptionalbooleanisPresent():与obj!null()一样;调用get()前要调用isPresent()检查,不然会报错Optional的三种构造方式:Optional.of(obj):obj不能为null,不然报npeOptional.ofNullable(
小万哥 小万哥
1年前
Java 抽象类与方法:实现安全性与代码重用
Java内部类简介在Java中,可以嵌套类(即类内部的类),称为内部类。嵌套类的目的是将属于一起的类分组,从而使您的代码更可读和可维护。访问内部类要访问内部类,请创建外部类的对象,然后创建内部类的对象:javaclassOuterClassintx10;c
夏侯存
夏侯存
Lv1
看破是心不颠倒;放下是心不贪恋。
文章
2
粉丝
0
获赞
0