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

什么是区别ptional.ofNullable()和'Optional.of()

公孙和怡
2023-03-14

首先,我知道这两种方法的区别。

>

  • Optional.of:用于保证没有null,如果输入null,nullPointExcepction

    Optional.ofNullable:可能为空,也可能不为空。用于灵活响应。

    所以,如果我添加orElseThrow(()-

    我想用显式内容抛出一个错误。

    所以我可以选择。不可用的(数据)。orElseThrow()-

    用它作为这是毫无意义的行为吗?

    可选。关于(数据)。orElseThrow()-

    我认为这也是可能的,但我只是使用of nullable()使代码看起来一致。

    综上所述,最后,如果您添加或ElseThrow(nullPoint)ofofNullable是否相同的结果?

    而不是的。orElseThrow更好吗?


  • 共有2个答案

    百里承业
    2023-03-14

    首先,我知道这两种方法的区别。

    可选。of:用于确保不存在null,如果输入null,则为NullPointException

    可选。ofNullable:可能是空的,也可能不是空的。习惯于灵活反应。

    有一个明显的误解点。

    的用途是可选的。of()不是“确保没有null”。它并不是用来断言传递给它的值是非空的。对于这种验证,可以使用对象。requirennull(),它要么抛出一个NPE,要么返回一个非空值。

    为了保持在同一页上,您必须记住的第一件重要事情是,在JDK中引入optionals只是为了一个特定的目的——作为返回类型。当可选对象被用作参数类型或字段类型,或者可选对象被存储在集合中时,任何其他情况都不被视为良好做法。同样,仅仅为了在其上链接方法或隐藏空检查而创建一个可选模式也被认为是一种反模式。

    以下是JDK开发者@StuartMarks回答问题时的几句话:

    可选的主要用途如下:

    可选旨在为库方法返回类型提供一种有限的机制,其中显然需要表示“无结果”,并且为此使用null极有可能导致错误。

    典型的代码味道是,它不是使用方法链接来处理从某个方法返回的可选项,而是从可为null的内容创建可选项,以链接方法并避免条件。

    我还建议您看看这个问题的答案“应该使用Optional.ofNullable()进行空检查吗?”,也是由Stuart Marks编写的。

    尽管如此,组合是可选的。of()。OrelsThrow()既错误又毫无意义:

    • 如果提供的数据为nullmethodof()将引发NPE,并且orelsetrow()将不会执行(即其异常将永远不会被触发)
    • 创建一个可选对象并不是为了返回由其包装的可为null的变量,而是为了隐藏null检查(请看上面的引号),这是滥用了optional。这模糊了代码的用途。可以使用对象。如果给定值不能为nullrequirennullElse()则引发异常,以提供默认值

    出于同样的原因,您不应该使用Optional。不可数()。首先是orelsetrow()

    如果它是一个包裹,您可能会认为是可选的。当您需要发送东西时,您会去邮局(即从方法返回),在那里必须发送的东西被放入盒子中。当某人(即调用者)收到包裹时,它会立即被打开。这是名为可选的盒子的整个生命周期。

    根据应用程序的逻辑,当需要从方法返回的对象不应为null-使用可选时。of()。它要么成功发送包裹,要么通过引发NullPointerException来强调存在问题。

    如果给定的对象本质上可以为空,即null不是异常情况,那么使用Optional.ofNullable(),它将触发包含该对象的框或空框。

    调用者(即调用返回可选项的方法的方法)必须使用可选项提供的各种工具(如orelsetrow()orElseGet()ifPresent())解包。

    蒋永宁
    2023-03-14
    匿名用户

    总而言之,如果你加上OrelsThrow(nullPoint),结果是一样的还是一样的?

    不。要了解这一点,只需查看类型。

    public static <T> Optional<T> of(T value);
    
    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
                                   throws X extends Throwable;
    

    Optional.of返回一个可选值

    if (x == null) {
      throw new NullPointerException(...);
    }
    

    实际上,您并没有使用可选的,只是制作了一个,然后以一种非常冗长的方式丢弃它。所以如果这是你的意图,只需做一个显式的null检查;根本不需要可选

    这就提出了一个问题,为什么我们会使用的或的。随着Optional的引入,现在有两种方式来表示Java中“此值可能不存在”的概念:nullOptional。empty()。互联网上的人们会争论到底哪一个更好,什么时候你应该使用哪一个(我对此有强烈的意见,我不会在这里分享,因为这不是你所要求的),但重点是有两种不同的方法来做。

    在这篇文章的其余部分,我将从静态编程语言中借用一些符号,并编写T?来表示“可能是nullT值”。它不是有效的Java符号,但它说明了问题。因此,如果我们想在Java中表示“可能存在或不存在的T”,我们可以使用可选

    如果我们想从T开始 可选

    您应该查看可选。作为某种断言的。如果Java有像Kotlin这样的可空类型,那么区别将是

    public static <T> Optional<T> of(T value);
    public static <T> Optional<T> ofNullable(T? value);
    

    也就是说,nullable的期望其值可能是null已经假定它不是<代码>可选。of应该被认为是一个断言,即你给它的值不是空的。如果断言失败,我们会立即抛出NullPointerException,而不是让错误传播到程序的其他部分。如果您正在呼叫可选。如果并从它抛出的空点异常中恢复[1],那么你做了一些非常错误的事情。该函数是我们开始处理非空数据的断言,如果该断言失败,那么您的程序应该立即失败,并具有良好的堆栈跟踪。

    听起来,根据您的用例,您的值可能是null。在这种情况下,可选。无法使用的是有意义的;它已经准备好处理用例。如果你想抛出一个自定义异常,你应该事先做一个空检查(因为你是处理null,而不是Optional)然后调用Optional。属于。当然,如果你打算用orelsetrow提取它,你也可以只做一个老式的null检查,而不使用可选的。当然,管道是可选的。不可利用的(价值)。orElseThrow(…) 在一行中会有代码气味。

    [1]请注意,我说的是“从中恢复”,而不是“捕捉”。一个很好的顶级捕获(Exception exc)记录所有错误是完全可以接受的,在更大的应用程序中通常是一个好主意。但是如果您正在执行catch(NullPointerException exc){return 0;}

     类似资料:
    • 本文向大家介绍#{}和${}的区别是什么?相关面试题,主要包含被问及#{}和${}的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 #{}是预编译处理,${}是字符串替换。 Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值; Mybatis 在处理{}时,就是把${}替换成变量的值。 使用#{}可以有效的防

    • synchronized 是和 if、else、for、while 一样的关键字,ReentrantLock 是类,这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比synchronized 更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量 synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 J

    • 发展至今(2020 年 6 月份),GCC 编译器已经更新至 10.1.0 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ 。 除此之外,当下的 GCC 编译器还支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序,甚至于 GCC 6 以及之前的版本还支持编译 Java 程序。但本

    • 本文向大家介绍redux和flux的区别是什么?相关面试题,主要包含被问及redux和flux的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 Flux: Store 包含状态和更改逻辑 有多个 Store 所有 Store 都互不影响且是平级的 有单一调度器 React 组件订阅 store 状态是可变的 Redux: Store 和更改逻辑是分开的 只有一个 Store 带有分层 re

    • 本文向大家介绍useState和this.state的区别是什么?相关面试题,主要包含被问及useState和this.state的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 内部基于 实现,方法返回 state 本身以及一个修改 state 的方法。 通过 修改数据,不会和 一样进行对象属性合并,会直接覆盖。 Hooks 函数组件中,存在的概念,在一次渲染闭包中,state 是固定不

    • 问题内容: 和,mysql有什么区别。 问题答案: 计算结果集中的所有行(如果使用GROUP BY,则为组)。 只计算不为空的那些行。即使没有NULL值,在某些情况下这也会变慢,因为必须检查该值(除非该列不可为空)。 与1 相同,因为1永远不能为NULL。 要查看结果的差异,您可以尝试以下小实验: 结果: