在集合中使用“可选”是否值得?

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

一些人认为 Optional 类型值得在集合中使用。据称它解决了像 HashMap 这样的问题,如果没有键的映射或者 null 映射到键,则返回 null。如果您使用 Map<Optional<Something>>,那么您可以清楚地将缺失的映射和缺失的值分开。 这样你就在兔子洞里更深了一层。

首先...

你可以...

...在不使用 Optional 的情况下判断键是否映射到 null 或未映射。有方法 containsKey()。这是另一个方法调用,用于将非映射键与映射空值分开。但是,调用 Optional 也会这样做。那么有什么意义呢?另一方面...

你不需要...

...判断键是否映射到 null 或映射是否丢失。如果两种情况下您的程序代码存在差异,那么您以错误的方式对业务逻辑进行了编码。这当然是一种代码味道。将 null 视为“无”,而不是认为“null 被分配给键 'aaaaaarrghhh'”,大声说:没有任何东西被分配给键 'aaaaaarrghhh'。你看?没有区别。现在你办公室里的每个人都用滑稽的眼神看着你。

使用 Optional 作为 Map 中的值...

你会...

......一段时间后,最终在兔子洞中更深一层。代码过着独立的生活。开发它的不仅是你。在大型组织中,有些开发人员在编码时肯定喝醉了。 (这是对某些代码的唯一合理解释。)他们将很快填充您的 Map<Optional<Something>>

  • 空值,
  • 缺少可选值
  • 甚至包装其他东西的可选对象,但不是你的“东西”。

有时,如果幸运的话,您甚至可能会发现一些非空、非缺失的 Optional<Something> 值。