try..catch VS long if() [重复]

2024-05-07

我的项目中有一个复杂的模型结构。
有时我必须得到一个deep从中放置价值。它看起来像下面这样:

something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();

问题是每个方法都可能返回null,我会得到NullPointerException以防万一。

我想知道的是如果喜欢我应该写长吗

if(something != null && something.getSomethongElse() != null && something..getSomethongElse().getSecondSomething() != null && something.getSomethongElse().getSecondSomething().getThirdSomething() != null && omething.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething() != null) {
    //process getFourthSomething result.
}

或者只使用 try..catch 就可以了,如下所示:

SomethingFourth fourth = null;

try {
    fourth = something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();
} catch (NullPointerException e) { }

if(fourth != null) {
    ///work with fourth
}

我知道NPE是一件应该避免的事情,但就我而言,避免它不是开销吗?


如果可以重构代码,让每个方法都返回Optional。可以避免空检查并尝试...捕获。

Optional<Result> result = something.getSomethingElse()
.flatMap(e -> e.getSecondSomething())
.flatMap(x -> x.getThirdSomething())
.flatMap(e -> e.getFourthSomething());
// at the end to check if result is present
result.ifPresent(..some_logic_here..); // or result.orElse(...);

so getSomethingElse()回报Optional<SomethingElse>, getThirdSomething() - Optional<ThirdSomething>等等。我们必须在这里使用flatMap(Function<? super T,Optional<U>> mapper)因为如果提供的映射器的结果已经是可选的,并且如果被调用,则 flatMap 不会用附加的可选来包装它。换句话说,如果map on map(e -> e.getSecondSomething())结果类型将是Optional<Optional<SecondSomething>>我们将不得不做不必要的事情get() call - map(...).get().map(...).

我希望这有帮助。

UPDATED您可以使用方法引用执行相同的操作。

Optional<Result> result = something.getSomethongElse()
            .flatMap(SomethongElse::getSecondSomething)
            .flatMap(SecondSomething::getThirdSomething)
            .flatMap(ThirdSomething::getFourthSomething);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

try..catch VS long if() [重复] 的相关文章

随机推荐

  • 如何在网页上使用 Apple 新的 San Francisco 字体

    我想在网站上使用新的 San Francisco 字体 我试过了 font San Francisco Helvetica Arial san serif 无济于事 我已经尝试过以下问题的答案这个问题 https stackoverflow
  • matplotlib - 模块“sip”没有属性“setapi”

    我刚刚设置了带有所有 Python 扩展的 VS Code 通过 Anaconda Python 版本为 3 8 3 解释器是 venv 当我运行这段代码时 import matplotlib pyplot as plt 错误显示 Exce
  • MySQL 不将 ı 视为 i?

    我在 MySQL 5 7 27 中有一个用户表utf8mb4 unicode ci整理 不幸的是 没有像 i 那样进行线程化 以下查询将找不到Y lmaz select id from users where name Yilmaz 我对其
  • 转换为 id 与真实类类型之间的差异,目标 C

    以下 2 种说法有什么区别 UILabel mainLabel id cell viewWithTag 10 and UILabel mainLabel UILabel cell viewWithTag 10 简短的回答 没有 这两种强制转
  • 如何对URL参数传输的秘密数据进行编码/加密?

    故事是这样的 我必须将一些机密信息从一个脚本传递到另一个脚本 在第一个脚本中 我需要先加密数据 然后再加密have to将加密数据附加到 GET 请求中并将其发送到另一个脚本 URL 看起来像这样 http mydomain com mys
  • 阻止 OpenGL.framework 在 Cocoa 应用程序中加载

    我的应用程序链接到这些框架 Cocoa Framework AppKit Framework CoreData Framework Foundation Framework 请注意 OpenGL Framework 是NOT已链接 但是 设
  • 如何在iframe中隐藏滚动条,但仍然能够滚动

    我的一个页面上有一个 iframe 其中有另一个页面 我想隐藏滚动条 但我找不到任何解决方案 我尝试过overflow hidden 但它不起作用 见下面的代码 CSS代码 iframe overflow hidden 由于您没有指定是否需
  • Pandas 随机样本删除

    我知道DataFrame sample 但是我怎样才能做到这一点并从数据集中删除样本呢 注意 据我所知 这与替换采样无关 例如这里是精华我想要实现的目标 这实际上不起作用 len df 1000 df subset df sample 30
  • mongoDB 中的游标隔离

    首先请原谅我问了一个愚蠢的问题 但我是 mongodb 和学习游标的新手 我有一个问题 为什么我们需要游标隔离 手册说 如果文档发生更改 对文档的干预写入操作可能会导致游标多次返回该文档 我无法理解这一点 如果有人可以提供更多说明或举一些例
  • 使用 pandas 插值将每月值转换为每日值

    我有 1000 列的 12 个平均每月值 我想使用 pandas 将数据转换为每日数据 我尝试过使用插但我得到了从 31 01 1991 到 31 12 1991 的每日值 这并不涵盖全年 一月份的值没有得到 我用了日期范围用于我的数据框的
  • R 编程:创建堆叠条形图,每个堆叠条形具有可变颜色

    我正在尝试创建一个堆叠条形图 每个堆叠条形图中的颜色可变 也就是说 一个条形图在红色上方显示蓝色 下一个条形图在紫色上方显示红色 等等 我还想保留堆叠图表的功能 十分感谢大家 Adam 下图 使用上面的代码创建 显示了主要汽车制造商生产的汽
  • 使用 Entity Framework 6 强制两列之一不为 NULL

    我有一个如下表 Table tblStore public class Store Key DatabaseGenerated DatabaseGeneratedOption Identity public Guid Id get set
  • 如何获取 ndarray 的 x 和 y 维度 - Numpy / Python

    我想知道是否可以分别获取 ndarray 的 x 和 y 维度 我知道我可以使用ndarray shape获取表示维度的元组 但如何在 x 和 y 信息中分离它 先感谢您 您可以使用元组拆包 y x a shape
  • 将 SAML 令牌与 Web 服务 (wsdl) 结合使用

    我已从提供商处获得了 wsdl 文件和 pfx 我致电 IdP 并获取 SAML 令牌 现在我需要将该令牌传递给 WebService 如何使用 SAML 令牌来处理 WebService 我正在使用 NET 4 5 在以下两篇文章的帮助下
  • 不会将字符串转换为十进制 C#(输入字符串的格式不正确。)

    Visual Studio 不会将我的字符串转换为十进制 错误 输入字符串的格式不正确 Code string test 123 95 decimal test1 decimal parse test string being an int
  • Java 支持多行字符串吗?

    来自 Perl 我肯定缺少在源代码中创建多行字符串的 here document 方法 string lt lt EOF create a three line string text text text EOF 在 Java 中 当我从头
  • 使用 opencv warpPerspective() 生成道路的自上而下视图

    我正在尝试实施逆透视映射计算与道路上另一辆车的距离 我知道在应用该函数之前我需要生成一个包含源点和目标点的变换矩阵warpPerspective 但我不知道如何计算目的地点 我在这个论坛和其他网站中搜索 但无法将第一张图片转换为第二张图片
  • 从 Get-ChildItem -Path 返回对象数组

    从 powershell 开始 ls R txt将按目录递归列出文件 或者更好 PS gt Get ChildItem Path C Test Name logs anotherfile txt Command txt CreateTest
  • 需要帮助找出为什么 for 循环的计数器变量被循环内的函数更改

    我的循环内的函数以某种方式改变了我正在迭代的值 但我不确定如何改变 如果描述得很糟糕 我很抱歉 在这个 for 循环内 int k for k 0 k lt 512 k Discardheader d doesnt actually do
  • try..catch VS long if() [重复]

    这个问题在这里已经有答案了 我的项目中有一个复杂的模型结构 有时我必须得到一个deep从中放置价值 它看起来像下面这样 something getSomethongElse getSecondSomething getThirdSometh