代码之家  ›  专栏  ›  技术社区  ›  hades

Java 8可选。为什么可以为空?[副本]

  •  16
  • hades  · 技术社区  · 6 年前

    我有一个关于Java 8的问题。 Optional 目的是解决 NullPointerException 例外情况。

    问题是,让我们选择这两种类型的原因是什么:

    Optional.of(T value)     <-----non-null value, null value will throw NPE
    Optional.ofNullable(T value)   <----- nullable value
    

    因为我所期望的是,当我使用:

    Optional.of(nullValue);
    

    它不会扔 空指针异常 .


    在回答完以下问题后展开了我的问题:

    为什么人们会选择任选而非正常 if-else 是否进行空值检查?

    6 回复  |  直到 6 年前
        1
  •  19
  •   Naman    6 年前

    JavaDOC Optional.of 明确阅读:

    @throws NullPointerException if value is null
    

    这就是你所期望的处理案件的要求,随着 Optional.ofNullable 它是一个小代码块,如下所示:

    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value); // 'Optional.of'
    }
    

    也就是说,选择一个还是另一个的决定 与应用程序设计一起使用,就像 value 可能是 null 或不 .


    就你的期望而言,这不是 Optional 实际上是为了。API注释进一步澄清了这一点(格式化我的):

    可选的 主要用作方法返回类型,其中 显然需要表示“无结果”,以及在何处使用 无效的 可能导致错误。 类型为的变量 可选的 不应该 本身就是 无效的 ;它应始终指向 可选的 实例。


    可选的目的是处理NullPointerException异常。

    旁白 :为了清楚地指出,这个选择当然会隐式地让您定义是否应该在运行时抛出一个NPE。但在编译时还没有确定。

        2
  •  12
  •   ETO    6 年前

    选修课的目的是解决 NullPointerException 例外

    是的,但在使用时不是在创建时。

    所以当你收到 Optional 通过一种方法,你可以通过使用 Optional.ifPresent , Optional.orElse , Optional.orElseGet Optional.orElseThrow 方法。

    但当您创建一个可选选项时,情况并非如此。因为它是您自己的方法,所以您必须知道对象是否可以为空。


    的要点 可选的 是为返回值的函数提供一种方法,以指示 返回值 . 见 this discussion . 这允许调用者继续一系列Fluent方法调用。

    斯图亚特马克

    请阅读 this post 更详细的解释。

        3
  •  6
  •   Pang firemonkey    6 年前

    我觉得JavaDoc非常简单明了:

    Optional.of(T value) 当你确信没有 null 值,如果空值发生在程序引发之外 NullPointerException 并将其视为bug。

    Optional.ofNullable(T value) 当你知道 无效的 值,在这种情况下,您的程序应该正常运行。


    Why would people opt for Optional instead of normal if-else method for null checking?

        4
  •  5
  •   JollyJoker    6 年前

    在阅读了一些答案和评论之后,我认为这个解释是缺失的。考虑一种方法

    public Optional<String> name(Customer c) {
        return c.isNew() ? Optional.ofNullable(getName(c)) : Optional.of(getName(c));
    }
    

    在这里你想扔一个 NullPointerException 如果客户不是新的并且应该有一个名字,那么你的代码就不一致了 null . 然而,如果客户是新的,名称可能还不存在,因此 ofNullable 在这种情况下,方法返回 Optional .

        5
  •  4
  •   HPH    6 年前

    为什么人们会选择可选的而不是普通的if-else方法进行空检查?

    的要点 Optional<T> 课程是提供表演的手段 零安全 映射操作。

    employeeOptional.map(Employee::getName).map(String::toUpperCase).ifPresent(upperCasedNameConsumer)

    上面的表达式可以替换 if-else 单个可读表达式中的语句。

    Optional.of 提供一个断言,使给定参数为 null-null 值,否则,您可以选择 Optional.ofNullable 如果您不确定输入。

    我强烈建议你阅读 javadoc 对于 可选<T> 类为更多 可选链接方法 为了你的利益。

        6
  •  1
  •   dnt    6 年前
    • Optional.ofNullable 是可以返回的现有API的包装 null . 您可以将其称为API的使用者。
    • Optional.of/Optional.empty 用于编写新代码 Optional 铭记在心。您将返回一个 可选的 创建与 of/empty 作为API的提供者。