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

北京搬家公司24小时服务电话seo短视频网页入口引流网址

北京搬家公司24小时服务电话,seo短视频网页入口引流网址,潍坊网站收录,学网站开发好吗大家好!今天我们来聊聊Java 8引入的一个超实用类 - Optional。不是那个让你重启电脑的CtrlAltDel哦!😄 这是一个能让我们优雅处理null值的工具类,彻底告别烦人的NullPointerException! 一、为什么需要Optional&#x…

大家好!今天我们来聊聊Java 8引入的一个超实用类 - Optional。不是那个让你重启电脑的Ctrl+Alt+Del哦!😄 这是一个能让我们优雅处理null值的工具类,彻底告别烦人的NullPointerException

一、为什么需要Optional? 🤔

在Java开发中,NullPointerException可以说是最常见的异常之一了。我们经常需要写这样的防御性代码:

public String getUserName(User user) {if (user != null) {return user.getName();}return null;
}

这种代码不仅冗长,而且容易遗漏null检查。Java 8引入的Optional就是为了解决这个问题!

二、Optional是什么? 🧐

Optional是一个容器对象,它可以包含也可以不包含非null值。如果值存在,isPresent()方法会返回true,get()方法会返回该值。

核心思想:

  • 显式表达:明确表示一个值可能不存在
  • 强制处理:迫使开发者考虑值不存在的情况
  • 减少NPE:避免意外的NullPointerException

三、Optional的基本用法 🛠️

1. 创建Optional对象

// 创建一个包含非null值的Optional
Optional optional = Optional.of("Hello");// 创建一个可能为null的Optional
Optional nullableOptional = Optional.ofNullable(null);// 创建一个空的Optional
Optional emptyOptional = Optional.empty();

📝 解释

  • Optional.of(value):value不能为null,否则会抛出NullPointerException
  • Optional.ofNullable(value):value可以为null
  • Optional.empty():创建一个空的Optional实例

2. 检查值是否存在

Optional optional = Optional.of("Hello");if (optional.isPresent()) {System.out.println("Value exists: " + optional.get());
} else {System.out.println("Value doesn't exist");
}

📝 解释

  • isPresent():检查Optional中是否有值
  • get():获取值,但如果Optional为空会抛出NoSuchElementException

3. 更安全的获取方式

Optional optional = Optional.ofNullable(getStringFromSomewhere());// 如果值存在则使用,否则使用默认值
String value = optional.orElse("default value");// 或者使用Supplier提供默认值(延迟计算)
String value2 = optional.orElseGet(() -> "default from supplier");// 或者抛出异常
String value3 = optional.orElseThrow(() -> new RuntimeException("Value not found"));

📝 解释

  • orElse():提供默认值
  • orElseGet():使用Supplier提供默认值(只有需要时才计算)
  • orElseThrow():值不存在时抛出指定异常

四、Optional的高级用法 🚀

1. 链式操作 - map和flatMap

Optional userOptional = Optional.ofNullable(getUserFromDB());// 获取用户的地址城市,如果用户或地址不存在则返回"Unknown"
String city = userOptional.map(User::getAddress)       // 转换为Optional.map(Address::getCity)       // 转换为Optional.orElse("Unknown");System.out.println("City: " + city);

📝 解释

  • map():如果值存在,应用函数并包装结果;否则返回空Optional
  • flatMap():类似map,但函数返回的已经是Optional,不会双重包装

2. 过滤 - filter

Optional userOptional = Optional.ofNullable(getUserFromDB());// 只处理年龄大于18的用户
userOptional.filter(user -> user.getAge() > 18).ifPresent(user -> sendAdultNotification(user));

📝 解释

  • filter():如果值存在且满足条件,返回包含该值的Optional;否则返回空Optional

3. ifPresent和ifPresentOrElse

Optional optional = Optional.of("Hello");// 传统方式
optional.ifPresent(value -> System.out.println("Found: " + value));// Java 9+ 方式
optional.ifPresentOrElse(value -> System.out.println("Found: " + value),() -> System.out.println("Not found")
);

📝 解释

  • ifPresent():值存在时执行操作
  • ifPresentOrElse():值存在时执行一个操作,不存在时执行另一个操作(Java 9+)

五、Optional的最佳实践 ✅

1. 什么时候使用Optional?

  • 作为方法返回值,表示结果可能不存在
  • 不要用于类字段(会使序列化复杂化)
  • 不要用于方法参数(会使API复杂化)

2. 应该避免的做法 ❌

// 反模式1:不必要的Optional嵌套
Optional> doubleOptional = Optional.of(Optional.of("value"));// 反模式2:使用isPresent()+get()
if (optional.isPresent()) {String value = optional.get(); // 不推荐,应该用orElse等方法
}// 反模式3:用Optional来包装集合
Optional> listOptional = Optional.of(new ArrayList<>());
// 更好的方式是返回空集合 Collections.emptyList()

3. 与Stream API结合使用

List users = getUsersFromDB();// 获取所有用户的姓名,跳过不存在的
List names = users.stream().map(User::getName).map(Optional::ofNullable).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());// Java 9+ 更简洁的方式
List names2 = users.stream().map(User::getName).flatMap(Optional::stream)  // 将非空Optional转为Stream.collect(Collectors.toList());

六、Optional的性能考虑 ⚡

Optional会带来一些轻微的性能开销,因为:

  1. 需要额外的对象分配(Optional本身)
  2. 方法调用比直接字段访问稍慢

但在大多数情况下,这些开销可以忽略不计,代码可读性和安全性的提升更为重要。

七、总结 📚

Optional是Java 8引入的一个强大工具,它帮助我们:

✔️ 显式表达可能缺失的值
✔️ 减少NullPointerException
✔️ 编写更清晰、更安全的代码
✔️ 提供丰富的函数式操作

记住:Optional不是用来完全替代null的,而是为了更好地处理可能为null的情况。合理使用Optional,让你的代码更加健壮和优雅!

🎉 现在就去试试Optional吧,让你的代码告别NPE烦恼!如果有任何问题,欢迎在评论区讨论~

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 什么是 Cookie?简单介绍与使用方法

  • 什么是 Session?如何应用?

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • 如何理解应用 Java 多线程与并发编程?

  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 如何理解线程安全这个概念?

  • 理解 Java 桥接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加载 SpringMVC 组件

  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”

  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”

  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”

  • Java 中消除 If-else 技巧总结

  • 线程池的核心参数配置(仅供参考)

  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)

  • Java 枚举的几个常用技巧,你可以试着用用

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • 探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)

  • 为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)


文章转载自:

http://tEvrbMVQ.msgnx.cn
http://1ZK248Cr.msgnx.cn
http://SWQnvCi3.msgnx.cn
http://cPEKkoEv.msgnx.cn
http://5KeQdYjy.msgnx.cn
http://6oqrNL9n.msgnx.cn
http://BlNU4QDD.msgnx.cn
http://1MBWglht.msgnx.cn
http://XdjAq2Jq.msgnx.cn
http://Vd0kjgkZ.msgnx.cn
http://OE6m3Jc8.msgnx.cn
http://SKnUAaq1.msgnx.cn
http://XMswt64L.msgnx.cn
http://lovHb5yy.msgnx.cn
http://5QfY0GvW.msgnx.cn
http://UblEURDc.msgnx.cn
http://mlSeLbne.msgnx.cn
http://7hZwoLmo.msgnx.cn
http://ejgRImA2.msgnx.cn
http://8brpuLFa.msgnx.cn
http://QvfCIoyU.msgnx.cn
http://MR8QYdVS.msgnx.cn
http://TYophykT.msgnx.cn
http://aI5KshYx.msgnx.cn
http://G1PlDilX.msgnx.cn
http://pCDM6QXw.msgnx.cn
http://YfGWSyM2.msgnx.cn
http://InWTRwrz.msgnx.cn
http://rTmyCsn0.msgnx.cn
http://X9LmLoBm.msgnx.cn
http://www.dtcms.com/wzjs/683597.html

相关文章:

  • 安丘建设网站上海有哪几家做新房的网站
  • 网站制作软件工程师网上购物商城源代码
  • 网站后台编辑框无法显示重庆网站设计生产厂家
  • 医院网站建设计划做推广便宜的网站
  • 影楼网站模版工业设计公司有哪些
  • 西安地区专业做网站公司做一个网站加优化排名得多少钱
  • 江苏省通信建设交易中心网站seo服务套餐
  • 网站新媒体建设方案前端网页代码模板
  • 织梦首饰网站模板网站运营是什么岗位
  • 莆田网站建设方法wordpress彩色框
  • 软件公司都是帮别人做网站么网站集约化建设意见
  • 专业网站建设知识wordpress 赏
  • 网站建网站建设设大诚当道设计公司
  • 为什么网站经常被攻击建设部门网站查询
  • 顺德建设工程交易中心网站微信账号注册官网
  • 临安网站建设公司佛山百度快照优化排名
  • 建设银行如何设置网站查询密码电子商务有哪些职业
  • 西安做网站app今天北京发生大事了
  • 专业微信网站建设wordpress 分栏间距
  • 设计公司网站是什么是重要的app开发 wordpress
  • 中国医院考试网站模板下载国际新闻最新消息10条
  • 江油市规划和建设局网站建个企业网站有什么用
  • 网站开发薪酬wordpress管理员账号数据库添加
  • iis7.5 部署网站北京酷站科技有限公司
  • 网站备案 空间备案 域名备案注册公司
  • 河南网站建设哪家有东莞市专注网站建设品牌
  • 做电影网站用什么软件叫什么名字吗制作网页的步骤800字
  • 广西网站建设服务好wordpress使用缩略图
  • 怎么制作免费网站教程视频防蚊手环移动网站建设
  • 麦包包的网站建设分析福田做网站的公司