当前位置: 首页 > article >正文

Optional类:避免NullPointerException

Optional类是Java 8中引入的一个容器类,用来包含或不包含非null对象。它的设计目的是为了提供一种更清晰、更安全的方式来处理可能为null的对象,从而避免NullPointerException。以下是Optional类的一些关键特性和常用方法:

关键特性:

  1. 非空检查Optional可以用来表示一个值存在或不存在,这比直接返回null更语义化。
  2. 链式调用Optional支持链式调用,可以流畅地进行一系列操作。
  3. 空安全:使用Optional可以避免直接操作null值,减少空指针异常的风险。

常用方法:

of(T value):
创建一个包含值的Optional实例。如果值是null,则抛出NullPointerException。

ofNullable(T value):
创建一个包含值的Optional实例。如果值是null,则返回一个空的Optional。

empty():返回一个空的Optional实例。

isPresent():如果Optional实例中有值存在,则返回true,否则返回false。

ifPresent(Consumer<T> consumer):
如果Optional实例中有值存在,则执行给定的Consumer操作,否则什么也不做。

get():
如果Optional实例中有值存在,则返回该值,否则抛出NoSuchElementException。

orElse(T other):
如果Optional实例中有值存在,则返回该值,否则返回指定的其它值。

orElseGet(Supplier<? extends T> other):
如果Optional实例中有值存在,则返回该值,否则返回由Supplier函数提供的值。

orElseThrow(Supplier<? extends X> exceptionSupplier):
如果Optional实例中有值存在,则返回该值,否则抛出由Supplier函数提供的异常。

map(Function<? super T,? extends U> mapper):
如果Optional实例中有值存在,则将值映射到另一个值,否则返回空的Optional。

flatMap(Function<? super T, Optional<U>> mapper):
如果Optional实例中有值存在,则将值映射到另一个Optional,否则返回空的Optional。

示例代码:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> optional = Optional.ofNullable(null);

        // 检查值是否存在
        if (optional.isPresent()) {
            System.out.println("Value is present.");
        } else {
            System.out.println("Value is not present.");
        }

        // 使用orElse提供默认值
        String value = optional.orElse("Default Value");
        System.out.println(value);

        // 使用orElseThrow抛出自定义异常
        try {
            String valueOrThrow = optional.orElseThrow(() -> new IllegalArgumentException("No value present"));
            System.out.println(valueOrThrow);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        // 使用ifPresent执行操作
        optional.ifPresent(System.out::println);
    }
}

使用Optional可以提高代码的可读性和健壮性,但它并不是解决null问题的万能钥匙。滥用Optional可能会导致代码难以理解和维护,因此应该在适当的时候使用它。


http://www.kler.cn/a/458872.html

相关文章:

  • 【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制
  • SqlSession的线程安全问题源码分析
  • SpringBoot教程(十四) SpringBoot之集成Redis
  • Nginx 配置文件详解(带示例)
  • SpringCloud源码分析-LoadBalancer
  • NLP中的神经网络基础
  • Go语言的字符串处理
  • 每天40分玩转Django:Django Channels
  • react-native键盘遮盖底部输入框问题修复
  • 对于多个网站的爬虫管理和配置支持
  • 前端处理跨域的几种方式
  • AI 加持下的智能家居行业:变革、挑战与机遇
  • 深度学习-78-大模型量化之Quantization Aware Training量化感知训练QAT
  • LeetCode每日三题(五)双指针
  • 基于PLC的电梯控制系统(论文+源码)
  • 从Huggingface下载的数据集为arrow格式,如何从本地路径读取arrow数据并输出样例
  • Knowledge is power——Digital Electronics
  • pytorch基础之注解的使用--003
  • 「Mac玩转仓颉内测版55」应用篇2 - 使用函数实现更复杂的计算
  • 项目优化性能监控
  • 基于YOLOv10和BYTETracker的多目标追踪系统,实现地铁人流量计数功能(基于复杂场景和密集遮挡条件下)
  • 前端学习DAY29(1688侧边栏)
  • NPM组件包 vant部分版本内嵌挖矿代码
  • 《燕云十六声》d3dcompiler_47.dll缺失怎么解决?
  • 深度学习中的HTTP:从请求到响应的计算机网络交互
  • JVM实战—5.G1垃圾回收器的原理和调优