简单聊聊如何更优雅的判断空值:Optional、三元运算符及其他方法

一、前言

在Java编程中我们经常会遇到判断一个变量或者表达式是否为空,如果为空就选择一个默认值赋给它,如果不为空就以它的实际值为准,这种情况我们都是如何处理呢,可能首先会想到三元运算符,除此之外还有别的方法吗,今天我们就来聊聊,并对它们各自的特点进行对比分析。

1. Optional

  • 引入:Java 8。

  • 目的 :优雅地处理null值,减少NullPointerException

  • 特点:显式地处理null,提供链式方法调用。

  • 示例代码

    复制代码
    public String getUsername(Optional<User> user) {
        return user.map(User::getUsername).orElse("defaultUser");
    }

2. 三元运算符

  • 形式boolean_expression ? expression1 : expression2

  • 目的:简洁地在两个表达式之间选择一个。

  • 特点:简洁性高,但可能影响可读性。

  • 示例代码

    复制代码
    public int getMax(int a, int b) {
        return a > b ? a : b;
    }

3. 其他方法

  • If-Else 语句 :基础的条件判断,易于理解和维护。

    复制代码
    public int getMax(int a, int b) {
        if (a > b) {
            return a;
        } else {
            return b;
        }
    }
  • Stream API :使用流来进行条件操作和值转换。

    复制代码
    public String getFirstNonEmptyString(List<String> strings) {
        return strings.stream().filter(s -> s != null && !s.isEmpty()).findFirst().orElse("defaultString");
    }

二、特点对比

对比表格:

特性 Optional 三元运算符 If-Else Stream API
引入版本 Java 8 Java 1.0 Java 1.0 Java 8
主要用途 显式处理可能为null的对象 快速条件判断 条件逻辑处理 条件过滤和转换
使用场景 方法返回可能是null的对象 简单的值选择 任何条件判断 流中的元素处理
表达式复杂度 可以链式调用,处理复杂逻辑 最适合简单逻辑 复杂逻辑 中等到复杂逻辑
方法/操作 isPresent(), ifPresent(), orElse(), 等 N/A N/A filter(), map(), findFirst(), 等
返回值 Optional 对象 两个表达式中的一个 代码块中的任意值 流操作的结果
性能 额外的对象分配成本 不创建额外的对象 无额外成本 可能有流操作开销
可读性 高,链式调用清晰 简单条件下高,复杂逻辑可读性下降 中等
简洁性 较低,需要多个方法调用 中等

三、小结

在选择值选择机制时,Optional和三元运算符提供了简洁与清晰的方法,

而if-else和Stream API适用于更复杂的逻辑。

开发者应根据具体情况,如代码清晰度、维护性和性能需求来选择最合适的方法。

随着Java语言的进化,更多的选择机制可能会出现,为开发者提供更多的灵活性。

相关推荐
weixin_3993806938 分钟前
TongWeb7.0.4.9M11一键安装脚本(by sy)
java·spring
CallFay云起未来44 分钟前
AI客服能不能减少人工回复?从重复咨询到人机协同的落地分析
java·大数据·人工智能·文心一言
我命由我123451 小时前
Android 开发 - 获取当前设备屏幕的旋转角度
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Elastic 中国社区官方博客1 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch
京东云开发者1 小时前
上游给空、下游拿到 -1,我把故障一直追到了 commons-beanutils 的构造函数
java·ai编程
阿无,1 小时前
Java多线程面试题之AQS
java·开发语言
数据狐(Datafox)1 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
摇滚侠1 小时前
《SpringBoot 3:入门与应用实战》第 7 章 AOP 思想与实现 阅读笔记 15
java·spring boot·笔记
风尘小子2 小时前
java静态类使用@Value动态绑定环境变量
java
重生之后端学习2 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展