当前位置: 首页 > 知识库问答 >
问题:

检查get链中的任何对象是否为空,而不必检查每个深度[重复]

齐雅畅
2023-03-14

我使用的是一个遗留应用程序,在这个应用程序中,我经常必须访问像这样深度嵌套的属性:

a.getB().getC().getD().getE().getF()
public Optional<F> retrieveValue(A a) {
  if(a != null && a.getB() != null && a.getB().getC() != null && 
     a.getB().getC().getD() != null && 
     a.getB().getC().getD().getE() != null && 
     a.getB().getC().getD().getE().getF() != null) {
    return Optional.of(a.getB().getC().getD().getE().getF());
  } else {
    return Optional.empty();
  }
}

F existingOrCreated = retrieveValue(a).orElse(new F());

共有1个答案

尉迟哲瀚
2023-03-14

在开始回答之前,我想指出,首先应该避免这些锁链。(查考得墨忒耳的律法)。

现在问题来了。因为Java不像Kotlin这样的其他语言提供更简单的空值检查,所以在Java8之前,您只能选择检查对象的每个级别。

但是由于Java8提供了函数传递作为参数,所以我开始使用这个特性在Java中构建我自己的“安全调用”:

public static <T> Optional<T> retrieveValue(Supplier<T> getter) {
  try {
    return Optional.ofNullable(getter.get());
  } catch (NullPointerException e) {
    return Optional.empty();
  }
}
F f = retrieveValue(() -> a.getB().getC().getD().getE().getF()).orElse(new F());

这种try-catch方法的一个小缺点是,如果在检查过程中出现nullpointerexception,它会比简单的空检查慢。

这种方法的另一个优点是,该方法可重用于任何深度的任何其他空检查,并且不依赖于特定的对象结构。

Node node = retrieveValue(() -> root.getNode().getNode()).orElse(new Node());
 类似资料:
  • 问题内容: 我很惊讶地发现这种情况总是成立的: 似乎无论最初是什么类型,它都将转换为相应类的实例。是否存在确定对象是否可靠的方法? 问题答案: 更新 我在下面显示的代码被报告在发行版本中不起作用。(请参阅下面的Paul Cantrell的评论。) 对于我的“据我测试”的道歉过于有限。 当我找到关于此的更多信息时,我将更新此答案。 我不确定我们是否可以在下一个Beta(或GM或已发布的版本…)中看到

  • 本文向大家介绍如何检查一个对象是否为空,包括了如何检查一个对象是否为空的使用技巧和注意事项,需要的朋友参考一下 检查一个数组为空很容易,直接调用 length 方法即可,那么如何检查一个对象是否为空呢 ❓ 这里的空指的是对象没有自有属性 假设这里有两个对象,一个是 obj 一个是 anotherObj 想了半天查看对象是否有 Symbol 属性只能使用 getOwnPropertySymbols

  • 本文向大家介绍JavaScript / Typescript对象是否为空检查?,包括了JavaScript / Typescript对象是否为空检查?的使用技巧和注意事项,需要的朋友参考一下 对于null检查,可以使用!健康)状况。 示例 以下是代码- 要运行以上程序,您需要使用以下命令- 在这里,我的文件名为demo305.js。 输出结果 这将产生以下输出-

  • 问题内容: JDK中是否有一种方法比较两个对象的相等性(是否为空)?像这样: 自己编写此方法似乎很愚蠢,因为我认为它必须已经存在于某个地方。 问题答案: Java 7.0添加了一个新的便捷类:。 它有一个专门用于此的方法:

  • 问题内容: 有没有一种快速的方法来检查对象是jQuery对象还是本机JavaScript对象? 例: 显然,上面的代码有效,但并不安全。您可能会向对象添加选择器键并获得相同的结果。有没有更好的方法来确保该对象实际上是jQuery对象? 符合 问题答案: 您可以使用运算符: 说明 :该函数(又名)被实现为构造函数。构造函数将以前缀调用。 调用时,内部jQuery将此转换为1。JavaScript继续

  • 问题内容: 我正在使用PHP读取JSON数据,并且该数据包含空对象(如)。所以问题是,我必须以不同的方式处理对象为空但无法找到足够好的方法进行检查的情况。看起来太吓人了,效率很低。有没有好的检查方法? 问题答案: 您要反序列化多少个对象?除非事实证明或强制转换是主要的放慢速度/瓶颈,否则我不会担心– Greg的解决方案就可以了。 不过,我建议在解码JSON数据时使用标志: 这会将JSON对象解码为