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

Optional.ofNullable(i).IfPresent…与if(i!=null)[duplicate]

张博涛
2023-03-14

我最近看到一篇博客文章(由@java发布),它暗示下面的代码正在变得越来越普遍:

Optional.ofNullable(i).ifPresent(x -> doBlah(x));

而不是:

if (i != null) {
  doBlah(i);
}

在这种情况下,Optional的使用对我来说似乎非常尴尬,甚至忽略了变量的命名--后者更容易阅读,对于用例来说也更习惯(处理空值)。我相信这也能更好地捕获语义--我的代码可能不符合Optional试图捕获的语义(如本文和Oracle文章所述)。

我看不出来,但是有没有一个好的语义原因来偏好Optional.IsNullable方法(忽略它可能产生的性能影响,这取决于它的使用方式)?

共有1个答案

左丘弘致
2023-03-14

对于相同的代码单元来说,将一个可能为空的对象包装在一个可选的对象中,只是为了对其调用ifPresent()没有多大意义。

更有用的情况是,可以返回空对象的API返回可选对象。这将强制调用方以null安全的方式处理潜在的null结果。由于API和调用方是单独的代码单元,将对象包装为可选的,并强制调用方调用ifpresent()的额外工作不仅是繁忙的工作,而且实际上强制执行一个更安全的契约,以防止空指针异常。

 类似资料:
  • 问题内容: 在javascript中,我看到过在很多情况下都使用过它,并且我知道它会为前面的值添加一个: 但是当我这样做时会发生什么: 并且使用运算符有什么不同(当然,它是减法而不是加法)? 问题答案: 和之间的区别是表达式的值。 该值是增量之前的值。的值是增量后的值。 例: 在与运营商的工作方式相同。

  • 问题内容: 有人告诉我,+=效果可能与的标准符号不同i = i +。是否有与以下情况i += 1不同的情况i = i + 1? 问题答案: 这完全取决于对象i。 +=调用__iadd__方法(如果存在- 如果不存在则返回),而+调用方法1或在某些情况下调用方法2。 从API的角度来看,应该将其用于就地修改可变对象(返回已变异的对象),而__add__应该返回某些东西的新实例。对于不可变的对象,这两

  • 问题内容: 哪个更正确?Java的结果为12或C =13。或者,如果不是正确性,请详细说明。 问题答案: 没有比这更正确的了。它实际上是未定义的,称为序列点错误。 http://en.wikipedia.org/wiki/Sequence_point

  • 问题内容: 以下Java程序平均需要0.50秒至0.55秒的时间运行: 如果我替换为,则需要0.60到0.65秒的时间来运行。怎么会? 我对该程序的每个版本运行了15次,两次交替运行。结果如下: 最快的运行时间比最慢的运行时间长。如果它们具有相同的效率,则发生这种情况的可能性将小于。 问题答案: 字节码的顺序略有不同。 : vs : 乍看之下,这没有什么区别;如果有的话,第二个版本更理想,因为它减

  • String str="i"会将起分配到常量池中,常量池中没有重复的元素,如果常量池中存中i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。 String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。

  • 本文向大家介绍String str="i"与 String str=new String(“i”)一样吗?相关面试题,主要包含被问及String str="i"与 String str=new String(“i”)一样吗?时的应答技巧和注意事项,需要的朋友参考一下 不一样,因为内存的分配方式不一样。String str=“i"的方式,Java 虚拟机会将其分配到常量池中,如果常量池中有"i”,就