有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    在Java中,Optional值是指示存在或不存在的位与任意引用类型T或原语intlongdouble的值的融合

    当从方法返回值时,融合这些值尤其有用,因为方法只有一个返回值。在引用类型的情况下,经常需要使用一个特殊的值,例如null,或者在int的情况下使用-1,作为指示“无值”情况的哨兵。使用Optional作为返回值可以避免调用者意外地误用sentinel值作为实际返回值的问题

    鉴于此,代码行

    Optional.ofNullable(port).ifPresent(settings::setPort);
    

    奇怪的是,它将一个值与行的第一部分中的当前/不存在位进行融合,然后在行的第二部分立即将其分离。这增加了最终相当简单的任务的复杂性:检查port是否为非空,并有条件地执行某些操作。可供选择的代码片段:

    if (port != null) {
        settings.setPort(port);
    }
    

    非常清楚地表达了它的功能

    的确,if语句比Optional链占用更多的垂直空间。{}链更密集,但也更难理解:这是一个糟糕的权衡

  2. # 2 楼答案

    虽然,您在问题中发布的代码片段只是一种避免丑陋的null-check的简单方法,但它是有效的、正确的和空安全的。在这种情况下,遵循你的个人偏好

    ^{}的真正力量是以下方法:

    • ^{}当前值应用过滤器
    • ^{}当前值应用映射函数

    例如,假设您想从port中获取另一个值,以便添加到列表中,并在portnull时避免NPE:

    Optional.ofNullable(port).map(port::getSomeValue).ifPresent(settings::setPort);
    

    此外,请避免对我经常看到的null-check进行以下无意义的替换:

    if (Optional.ofNullable(port).isPresent()) {
        settings.setPort(port);
    }
    
  3. # 3 楼答案

    何时使用它取决于几个因素。 如果port是类中的一个属性,那么使用Optional可能有点过头了。(不要像使用not serializbie一样使用Optionals作为属性)

    我认为Optional是伟大的,例如写一个库

    public Optional<Integer> getPort()
    

    对于其他开发人员来说更具描述性

    // Returns null if not set
    public Integer getPort()