【面试题精讲】JavaOptional用法

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址

文章更新计划

系列文章地址


Java 8 引入了 Optional 类,用于解决空指针异常(NullPointerException)的问题。Optional 是一个容器类,可以包含一个非空的值或者表示值不存在。通过使用 Optional,我们可以更加优雅地处理可能为空的值,避免了繁琐的空值检查和异常处理。

下面是 Optional 类的一些常用方法和用法:

  1. 创建 Optional 对象:

    • 使用 Optional.of(value):创建一个包含指定值的 Optional 对象。如果传入的值为 null,则会抛出 NullPointerException
    • 使用 Optional.ofNullable(value):创建一个包含指定值的 Optional 对象。如果传入的值为 null,则会创建一个空的 Optional 对象。
    • 使用 Optional.empty():创建一个空的 Optional 对象。
  2. 判断值是否存在:

    • 使用 isPresent() 方法:判断 Optional 对象中是否包含值。如果值存在,返回 true;否则,返回 false
  3. 获取值:

    • 使用 get() 方法:获取 Optional 对象中的值。如果值存在,返回该值;否则,抛出 NoSuchElementException 异常。在使用 get() 方法之前,最好先使用 isPresent() 方法进行判断。
  4. 处理值不存在的情况:

    • 使用 ifPresent(Consumer<? super T> consumer) 方法:如果值存在,则执行指定的操作。可以传入一个 Consumer 函数式接口,用于处理值存在的情况。
    • 使用 orElse(T other) 方法:如果值不存在,则返回指定的默认值。
    • 使用 orElseGet(Supplier<? extends T> supplier) 方法:如果值不存在,则通过指定的供应函数获取一个默认值。
    • 使用 orElseThrow(Supplier<? extends X> exceptionSupplier) 方法:如果值不存在,则抛出指定的异常。

下面是一个简单的示例,展示了 Optional 的用法:

java 复制代码
import java.util.Optional;

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

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

        // 判断值是否存在
        boolean isPresent = optional.isPresent();
        System.out.println("Value is present: " + isPresent);

        // 获取值
        String retrievedValue = optional.get();
        System.out.println("Retrieved value: " + retrievedValue);

        // 处理值存在的情况
        optional.ifPresent(v -> System.out.println("Value exists: " + v));

        // 处理值不存在的情况
        String defaultValue = optional.orElse("Default Value");
        System.out.println("Default value: " + defaultValue);

        // 使用函数式接口处理值不存在的情况
        String suppliedValue = optional.orElseGet(() -> "Supplied Value");
        System.out.println("Supplied value: " + suppliedValue);

        // 抛出异常处理值不存在的情况
        try {
            String thrownValue = optional.orElseThrow(() -> new RuntimeException("Value not found"));
            System.out.println("Thrown value: " + thrownValue);
        } catch (RuntimeException e) {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

在这个示例中,我们创建了一个包含字符串值的 Optional 对象,并演示了判断值是否存在、获取值、处理值存在和值不存在的情况的用法。

使用 Optional 可以提高代码的可读性和健壮性,避免了繁琐的空值检查和异常处理。但需要注意的是,不要滥用 Optional,在某些情况下,使用传统的空值检查可能更加合适。

本文由mdnice多平台发布

相关推荐
梁下轻语的秋缘7 分钟前
ESP32-WROOM-32E存储全解析:RAM/Flash/SD卡读写与速度对比
java·后端·spring
wanzhong233310 分钟前
开发日记8-优化接口使其更规范
java·后端·springboot
羊小猪~~1 小时前
【QT】--文件操作
前端·数据库·c++·后端·qt·qt6.3
张彦峰ZYF2 小时前
商品供给域的工程化简要设计考量
后端·系统架构·商品模型·商品供给
小北方城市网3 小时前
微服务注册中心与配置中心实战(Nacos 版):实现服务治理与配置统一
人工智能·后端·安全·职场和发展·wpf·restful
爬山算法4 小时前
Hibernate(47)Hibernate的会话范围(Scope)如何控制?
java·后端·hibernate
源码宝5 小时前
云HIS二次开发实施路径指南
后端·源码·二次开发·saas·云his·医院信息系统
李慕婉学姐8 小时前
Springboot旅游景点管理系统2fj40iq6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
蓝眸少年CY8 小时前
(第八篇)spring cloud之zuul路由网关
后端·spring·spring cloud
long3168 小时前
弗洛伊德·沃肖算法 Floyd Warshall Algorithm
java·后端·算法·spring·springboot·图论