Java 8 Optional在实际业务场景中的运用

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

写作背景

  • 在看到Optional这一新特性时,我就迫不及待的通过搜索引擎学习了一波。但是各种教程所提供的示例,让我完全感觉不到Optional的方便之处,甚至让我产生了一种错觉,觉得这个新特性是累赘的,完全不必要的。

  • 在深入源码以及经过一段时间的摸索和使用后,也算是对Optional有了比较浅显的理解。Optional作为npe的解决方案,其实效果还是特别明显的,能很大程度上减少npe异常发生的频率,可以让源码更易于阅读。借着闲时,把自己用到的Optional方法总结下来,以供后续查阅。
无效示例1

你是否看过这样的示例?

public void test(String userName) {
   
   
    Optional<String> options = Optional.ofNullable(userName);
    if (options.isPresent()) {
   
   
    	String s = options.get();
        // do something
    }
}

如果单单只是判断是否为null,那么直接用==更方便,大可不必使用Optional,这既没有展示Optional的特性,也体现不了Optional的优势。



无效示例2

又或者这样的示例:

public void test(String userName) {
   
   
    Optional<String> optional = Optional.of(userName);
    optional.ifPresent(System.out::println);
}

一些文章为了将每一个Optional的每一个方法解释清楚,便将每个方法都单独写了一个示例。然而实际的使用是需要将Optional的多个方法联系起来才能最大发挥它的作用,单个示例就导致它们的剥离感严重,根本无法与实际业务结合起来使用,导致参考意义下降。



因此本文将不会对Optional的各个方法进行详细的阐述,只会说明Optional在实际场景中如何使用,并提及一些Optional方法的注意事项。



运用场景

Optional的作用

  • 开头提到了,Optional作为npe(NullPointerException)的解决方案,它的最主要作用就是保证操作一个null对象时,流程依旧会流转下去,不会不经开发者同意就向上抛出npe(是否抛取决于开发者的业务)。可以把这种功能简单的理解为Optional的每一步操作都会进行一个非空校验,空和非空会各自执行一个分支语句。

注意事项

  • 如果已知对象不可能为空,则尽量不要使用这个类来增加代码的复杂度。
  • 如果条件判断比较简单,一般也不会用到Optional。
  • 鉴于大多数情况下,开发者都不会主动去校验对象是否为null,从而导致程序中断,所以一般推荐将Optional用于查询结果的非空校验。
示例类关系示例

Product

public class Product {
   
   
	private Long id;
    /**
     * 商品详情
     */
    private ProductDetail productDetail;
    private Long categoryId;
    /**
     * 分类信息
     */
    private Category category;
    private Long brandId;
    /**
     * 品牌
     */
    private Brand brand
Springboot +mybatis-plus 实现公共字段自动填充 本文讲述了在SpringBoot 中使用Mybatis Plus如何实现一个自动填充功能。 目录一、应用场景二、代码实现步骤1.建数据库表 t_user2.创建spring boot项目集成mybatis-plus实现字段自动填充2.1 配置pom.xml 和 application.yml2.2 编写User实体,添加填充注解2.3 创建一个UserMapper2.4 自定义公共字段填充处理器2.5 创建UserController,编写方法测试字段自动填充三、测试四、扩展1.编写BaseEntity公共 阅读详情

相关推荐

Java 8 新特性:Optional 的 7 个实用场景

Java 开发中,空指针异常(NPE)是最常见的“坑”之一。传统代码中,我们需要大量使用if (obj!= null)做防御性检查,不仅代码冗余,还容易遗漏。Java 8 推出的Optional类,正是为了解决这一问题。本文将聚焦Optional的核心功能,结合 7 个高频开发场景,教您用更优雅的方式处理空值。本文将先通过生活案例解释Optional的核心概念,再结合 7 个真实开发场景,展示Optional的具体用法。最后总结最佳实践,帮助您避免常见误区。用户系统。

AI开发架构师 420

详细分析Java中的Optional类以及应用场景

用开发的角度来讲,该类是 Java 8 中引入的一个用于处理可能为 null 的值的容器类。 它的设计目的是为了解决在代码中频繁出现的空指针异常问题。

码农研究僧的博客 1万+

Java8Optional企业级业务应用示例,优化NullPointerException冗余校验

绝不返回null的OptionalOptional.empty() 替代 null避免Optional嵌套:用flatMap解包尽早处理空值:orElse()/orElseThrow()放在链条末端慎用get():95%场景不需要调用get()性能敏感处权衡:频繁调用的热代码路径慎用1、方法设计原则:方法返回Optional时,应保证不返回null Optional避免Optional<Optional<T>>结构2、使用选择:转换值类型:用map。

BADAO_LIUMANG_QIZHI的博客 754

Java8新特性】史上最全Optional实战教程,太厉害了!

1.Java 8新增了一个类 - Optional2.Optional是一个容器,用于放置可能为空的值,它可以合理而优雅的处理 null。3.Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空4.java.util.Optional类本质上就是一个容器,该容器的数值可以是空代表一个值不存在,也可以是非空代表一个值存在。

quanzhan_King的博客 5177

利用JDK8提供的Optional简化if else

程序猿开日常开发中,为了避免NullPointerException异常,会写很多if else的判断。如果if else太多会让代码显的很乱,那如何减少if else的使用呢? 减少if else的方式之一,利用JDK8提供的Optional。 代码示例: 示例中getStartTime()获取String类型的时间字符串并返回。执行逻辑: 调动selectStartTime()查询DB返回LocalDateTime值; 响应值dateTime如果为null,就给一个默认值; 响应值dateTime

WLQ0621的博客 3118

java8Optional 详解

1、Optional 介绍 传统的写代码方式经常会遇到NullPointerException,这就需要我们在代码中经常判空。而判空的写法又会显得很累赘,这里就可以用到Optional来简化代码。 Optional是在java.util包下的一个用于代替null的一个工具类。 import java.util.Optional; Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。 Optional 类是一个可以为n

m0_58680865的博客 1万+

建议收藏,Java Optional如何使用的最佳实践

OptionalJava8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计就可以变得十分优雅。本篇文章还介绍了如何使用Optional,以及推荐的方法。

分享技术,记录思考和感悟 2806

如何正确的使用 Java 8 的新特性之 Optional

如何正确的使用Java 8的新特性之 Optional场景模拟创建实例Optional.empty()Optional.of(value)Optional.ofNullable(value)访问 Optional 对象的值检查 Optional 对象不为空isPresent()ifPresent()返回默认值orElse()orElseGet()orElse() 和 orElseGet() 的不同...

Long-Tai 2万+

Java8新特性Optional,Function,Supplier,Consumer

首先,Optional它不是一个函数式接口,设计它的目的是为了防止空指针异常(),要知道在 Java 编程中, 空指针异常可是臭名昭著的。让我们来快速了解一下Optional要如何使用!你可以将Optional看做是包装对象(可能是null, 也有可能非null)的容器。当你定义了 一个方法,这个方法返回的对象可能是空,也有可能非空的时候,你就可以考虑用Optional来包装它,这也是在 Java 8 被推荐使用的做法。Optional 经典实践。

记录开发日常笔记 1364

Java8系列 (五) Optional

概述时光小说网 https://www.youxs.org/ 在Java8之前, 如果需要对一个变量做一次 null 检查, 通常会像下面这样写 T t = service1.query(); if (t != null) { K k = service2.update(t); if (k != null) { U...

代码小牛的博客 220

Java 8 新特性 | Optional解决空指针异常

Java 8 新特性 | Optional解决空指针异常 日常开发中最常见的异常大概就是NullPointerException,因为我们写业务代码的时候经常不会去考虑这个对象为空,这个属性为空的情况。当测试告诉我们程序报错了,我们一看日志报错信息为空指针异常,然后就会恍然大悟,哦这里忘记加空值判断了,于是就会写if (face!=null)这样的代码去规避这样的问题。但是当出现对象包含对象的情...

zippo_zu的博客 527

Java Optional总结

概述 Optional的本意是为了避免null带来的错误,为我们提供一个可以明确表示空值的有限的机制。 基础理解 Optional是一个容器,用于放置可能为空的值,它可以合理而优雅的处理null。 Jdk1.8后,jdk新增了Optional来表示空结果。其实本质上什么也没有变,只是增加了一个表达式。 Optional表示空的静态方法为Optional.empty(),跟null有什么本质区别吗?看它的实现,Optional中的value就是null,只不过包了一层Optional,所以说它其实是个容器。用

抽象的螺旋 3539

Java8Optional的正确使用姿势

单纯的使用Optional并不能很好的解决业务中的NPE问题 - 简书 https://www.jianshu.com/p/f21afe47a3e7 单纯的使用Optional并不能很好的解决业务中的NPE问题 工作中经常会遇到NPE(NullPointException)问题怎么处理,得到最多的回答就是Optional来处理,但是单纯的使用Optional并不能很好的...

我是guyue,guyue就是我O(∩_∩)O 1339

Java开发中的简洁行为--Optional判空

本文介绍了Java 8引入的Optional类在解决空指针问题上的应用。Optional作为一个容器类,能强制开发者显式处理可能为null的值。文章对比了传统嵌套判空方式和Optional的链式调用方式,展示了后者更简洁优雅的特点。同时指出了Optional使用场景(如方法返回值、链式调用)和应避免的场景(如方法参数、类字段),并提醒在性能关键路径中需谨慎使用。通过示例代码演示了如何用Optional优化多层判空逻辑,使代码更简洁清晰。

m0_62967939的博客 532

Java 8 Optional 类实战:从根源杜绝空指针异常的优雅方案

Optional 类是 Java 8 为空值处理提供的优雅解决方案,它通过 “容器化封装” 和 “链式调用”,消除了传统的嵌套 if 判断,强制开发者处理空值场景,从根源上减少了空指针异常的发生。Optional 的map()、filter()等方法属于 “中间操作”,它们具有 “惰性执行” 的特性 —— 即仅记录操作逻辑,不立即执行,直到调用orElse()、get()等 “终止操作” 时才触发整个链式流程的计算。例如,要获取 “用户的订单的商品的分类名称”,传统代码如下:​。

m0_72256543的博客 513

Java Optional 类教程详解

OptionalJava 8 引入的函数式容器类(),专为​​设计。

Rysxt_的博客 1117

[实践总结] Java8 Optional常见用法

Optional类(java.util.Optional)是一个容器类,代表一个值存在或不存在。Java 8的库设计人员引入了Optional,这样就不用返回众所周知容易出问题的null了。

张紫娃的博客 458

使用JAVA 8Optional做参数校验

当参数校验不通过,你不想抛出Exception时,也可以考虑使用Optional类来实现,由调用方去处理错误信息。

Sam_Deep_Thinking 722
上一篇: HotSpot VM垃圾收集器——Serial Parallel CMS G1垃圾收集器的JVM参数、使用说明、GC分析
下一篇: 【JVM基础内容速查表】JVM基础知识 默认参数 GC命令 工具使用 JVM参数设置、说明、使用方法、注意事项等(持续更新)
涝山道士
博客等级 码龄10年 661粉丝 · 53原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值