”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 8 的可选类如何简化链接 Getter 并避免 NullPointerExceptions?

Java 8 的可选类如何简化链接 Getter 并避免 NullPointerExceptions?

发布于2024-11-08
浏览:407

How Can Java 8\'s Optional Class Simplify Chaining Getters and Avoid NullPointerExceptions?

链接 Getter 并处理 NullPointerExceptions

执行一系列 getter 调用以从嵌套对象中检索数据时,有必要执行 null 检查以避免 NullPointerExceptions。在处理多个级别的对象时,这很快就会变得冗长和笨拙。

嵌套 If 语句

一种常见的方法是嵌套 if 语句,检查在继续之前链为 null。然而,这种方法可能会变得笨重且难以维护。

打破德米特定律 (LoD)

这种方法违反了德米特定律 (LoD) ,它规定方法只能调用它们直接引用的对象上的其他方法。通过访问超出其直接上下文的对象,此方法违反了所涉及的类的封装。

使用Optional (Java 8)

幸运的是,Java 8 引入了Optional 类,它提供了一种更优雅且类型安全的方式来处理 getter 链中的 null 值。 Optional 表示可能为 null 的值,并提供映射和过滤其包含的值的方法。

使用Optional.ofNullable 链式获取器

要使用Optional 链式获取器,只需调用链中第一个对象上的Optional.ofNullable()。这将创建一个表示值或 null 的可选对象。然后,您可以链接 map() 操作以将 getter 调用应用于该值,Optional 将自动处理 null 检查。

Optional doorknob = Optional.ofNullable(house)
        .map(house -> house.getFloor(0))
        .map(floorZero -> floorZero.getWall(WEST))
        .map(wallWest -> wallWest.getDoor())
        .map(door -> door.getDoorknob());

安全与封装

这种做法不仅简化了代码,还保证了类型安全。如果您尝试访问它表示的值而不先检查它是否为空,Optional 类将引发异常。此外,它维护了所涉及的类的封装,因为您只能直接访问您引用的对象上的方法。

结论

虽然有时可能需要违反 LoD,通常建议在链接 getter 时避免过度嵌套 if 语句。相反,请考虑使用Optional类以更优雅和类型安全的方式处理空值。

最新教程 更多>
  • 从PHP网址保存图片到本地电脑的技巧
    从PHP网址保存图片到本地电脑的技巧
    从php urls 如果您的PHP配置允许从URL获取数据,则可以使用以下代码:但是,如果由于安全性问题而禁用file_get_get_contents,则可以使用curl:通过使用以下一种方法,您可以方便地将图像从远程PHP URL保存到本地系统。[&& &&&&&华
    编程 发布于2025-04-19
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-04-19
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-04-19
  • 如何在没有querySelectorAll时通过属性选择元素?
    如何在没有querySelectorAll时通过属性选择元素?
    如何通过属性检索元素时,当QuerySelectorAll不可用document.querySelectorAll('[data-foo]')However, in the absence of querySelectorAll, an alternative solution i...
    编程 发布于2025-04-19
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-04-19
  • 如何从2D数组中提取元素?使用另一数组的索引
    如何从2D数组中提取元素?使用另一数组的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    编程 发布于2025-04-19
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 ; $ date->修改('1个月'); //前进1个月 echo $ date->...
    编程 发布于2025-04-19
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-04-19
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-04-19
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-04-19
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确...
    编程 发布于2025-04-19
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-19
  • Go中如何保持固定数量的并发Goroutine运行?
    Go中如何保持固定数量的并发Goroutine运行?
    在go中螺纹goroutines:同时运行常数 GO并发领域在等待完成指定数量的Goroutines时提供了多种材料。但是,一个独特的挑战提出了自己:确保连续执行预定义的goroutines,一个开始作为另一个结论。考虑一个具有大量任务的情况,例如处理从mysql数据库中检索到的数据。一种天真的方...
    编程 发布于2025-04-19
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-04-19
  • 如何从MySQL两表中检索数据及处理缺失对应项?
    如何从MySQL两表中检索数据及处理缺失对应项?
    从mySQL中的两个表中进行选择,带有缺失的通讯器Consider the following example:You have two tables, categories (with columns id and title) and products (with columns id, ow...
    编程 发布于2025-04-19

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3