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

为什么使用可选的。超过可选的。不可能吗?

颛孙玉石
2023-03-14

当使用Java8Optional类时,有两种方法可以将值包装到Optional中。

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

我理解可选。不可用的是使用可选的唯一安全方法,但为什么可选呢。是否存在?为什么不直接使用可选。是否始终处于安全的一侧?


共有3个答案

羊舌源
2023-03-14

这取决于情景。

假设你有一些业务功能,你需要进一步处理具有该值的东西,但是在处理时具有null值会影响它。

然后,在这种情况下,可以使用Optional

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .map(<doSomething>)
                      .orElse("Default value in case of null");

冷浩瀚
2023-03-14

此外,如果你知道你的代码不应该工作,如果对象是null,你可以抛出异常使用Optional.orElseThrow

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .orElseThrow(NullPointerException::new);
                   // .orElseThrow(CustomException::new);
欧阳子石
2023-03-14

您的问题基于这样一种假设:可能抛出NullPointerException的代码比不抛出的代码更糟糕。这种假设是错误的。如果由于程序逻辑,您希望您的foobar永远不会为空,那么最好使用Optional。of(foobar)因为您将看到一个NullPointerException,它将指示您的程序有一个bug。如果使用选项。由于该错误,foobarfoobar恰好是null,那么您的程序将继续默默地不正确地工作,这可能是一个更大的灾难。这样一来,错误可能会在很久以后发生,并且更难理解错误发生在哪一点。

 类似资料:
  • 为了区分(a)任何值、(b)显式null和(c)无值的情况,我使用和注释。 这在Spring Boot 2.1.0/Jackson 2.9.7中非常适用。 目前(更新后)似乎像一样处理。它呈现,尽管该字段是用注释的。在Spring Boot 2.5.5/Jackson 2.12.5中,它呈现:

  • 问题内容: 它以空字符串开头,而不是nil。即使将其显式设置为nil,它仍然是一个空字符串。我不明白 也许通过分配nil使其易于清除?用它编写代码很麻烦。 问题答案: 这是历史性的事情。空字符串和字符串之间没有任何区别。在Objective- C中,无需在两者之间进行区别,因为您可以在Objective-C中调用方法。 同样,在Objective-C中也无法阻止用户分配给属性。生成的合同可以是可选

  • 我在许多网站上读到可选的应该只作为返回类型使用,而不是在方法参数中使用。我很难找到一个合乎逻辑的原因。例如,我有一个逻辑,它有两个可选参数。因此,我认为这样写我的方法签名是有意义的(解决方案1): 许多网页指定可选的不应用作方法参数。考虑到这一点,我可以使用下面的方法签名并添加一个清晰的Javadoc注释来指定参数可能是空的,希望将来的维护者会读取Javadoc并因此在使用参数之前总是执行空检查(

  • 我读了很多关于应该使用的案例。 我读过的许多页面都说不应该用于私有实例变量,而应该由getters返回。 我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到一个值可以是空的,而不必检查留档是否可以返回空。 在Scala中,null从未使用过,它只是用于与Java的互操作性。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义。 这里有一页提到了它: ht

  • 这两种方法有什么区别:和? 请举个例子。

  • 我想使用可选实用程序在JDK8中执行空检查。这是我写的代码,给我一个错误: 这里可以显示或不显示“jcr:description”。如果它存在,我想在description变量中使用该值,如果为null,只需为description设置空白字符串。这里也可以使用Lambda表达式吗?谢谢