如何优雅的判断一个对象是否为空?

我们在刚开始学习Java的时候,遇到过最多的异常肯定是臭名昭著的空指针异常(NullPointerException),可以说它陪伴了我们整个初学阶段。字符串、对象、集合等等一不留神就容易出现空指针异常!

那么如何优雅的判断一个对象是否为空并且减少空指针异常呢?

今天来介绍一个容器类------Optional

Optional介绍

Optional是一个容器类,它只有两种情况:

  • 要么包含一个非空对象
  • 要么为空

它有助于编写更健壮的代码,以处理可能为空的值,而不必担心空指针异常!

Optional用法

Optional的创建

Optional有以下两种常见的创建方法:

  • Optional.of(T value):创建一个包含非空值的Optional,如果value为null,则抛出NullPointerException
  • Optional.ofNullable(T value):创建一个Optional,允许value为null

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

isPresent(): 返回一个布尔值,如果Optional容器中包含一个非空对象则返回true,否则返回false

获取Optional容器的对象

  • get(): 如果Optional包含非空值,返回该值;否则抛出NoSuchElementException
  • orElse(T other): 如果Optional为空,返回指定的默认值other
  • orElseGet(Supplier<? extends T> other): 如果Optional为空,使用提供的Supplier函数生成默认值
  • orElseThrow(Supplier<? extends X> exceptionSupplier): 如果Optional为空,抛出由提供的Supplier函数生成的异常

过滤

filter(Predicate<? super T> predicate): 如果Optional包含非空值且满足predicate条件,则返回当前Optional,否则返回一个空Optional。

映射

  • map(Function<? super T, ? extends U> mapper): 如果Optional包含非空值,应用mapper函数并返回新的Optional。
  • flatMap(Function<? super T, Optional> mapper): 类似于map,但允许mapper函数返回Optional。

Optional示例

假如我们有一个User类,可以使用Optional来处理可能为空的User对象。User类结构如下:

arduino 复制代码
public class User {
    private String name;
    
    public User(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

示例:创建Optional

Optional userOptional = Optional.ofNullable(new User("张三"));

示例:判断Optional是否包含对象

csharp 复制代码
if (userOptional.isPresent()) {
    System.out.println("用户存在:" + userOptional.get().getName());
} else {
    System.out.println("用户不存在");
}

示例:获取Optional容器的对象

sql 复制代码
User user = userOptional.orElse(new User("李四"));
System.out.println("User: " + user.getName());

示例:过滤

less 复制代码
Optional<User> filteredUserOptional = userOptional.filter(u -> u.getName().startsWith("张"));
if (filteredUserOptional.isPresent()) {
    System.out.println("结果:" + filteredUserOptional.get().getName());
} else {
    System.out.println("未找到对应用户");
}

示例:映射

ini 复制代码
Optional<String> userNameOptional = userOptional.map(User::getName);
userNameOptional.ifPresent(name -> System.out.println("用户名为: " + name));

使用场景总结

  • 当你从某个方法返回一个值,但该值可能为空,而调用者需要明确知道值是否存在。
  • 在处理方法参数时,你可以用Optional来表示某个参数可以为空,以提醒调用者可能会传入null。
  • 避免繁琐的null检查和条件语句,使代码更简洁和可读!

更多文章干货,推荐公众号【程序员老J】

相关推荐
努力努力再努力wz7 分钟前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz10 分钟前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python
LaLaLa_OvO15 分钟前
mybatis 引用静态常量
java·mybatis
小糖学代码17 分钟前
LLM系列:2.pytorch入门:3.基本优化思想与最小二乘法
人工智能·python·算法·机器学习·ai·数据挖掘·最小二乘法
Han_han91918 分钟前
常用API:
java·开发语言
爱写代码的倒霉蛋19 分钟前
天梯赛备赛经验分享(基础版)
经验分享·算法
splage25 分钟前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
woniu_maggie27 分钟前
SAP RESTful 接口服务发布教程
后端
用户2794208313228 分钟前
临时解决 Mac SSH 客户端与服务器算法不匹配问题
后端
小锋java123431 分钟前
LangChain4j 来了,Java AI智能体开发再次起飞。。。
java·人工智能·后端