可选与null。 Java 8中Optional的目的是什么?

时间:2015-02-26 15:32:09

标签: java java-8

在Java 8中,您可以返回Optional而不是null。 Java 8文档说可选是“容器对象,它可能包含或不包含非空值。如果存在值,isPresent()将返回true,get()将返回值。”

在实践中,为什么这有用? 此外,是否有优先使用null的情况?性能怎么样?

4 个答案:

答案 0 :(得分:29)

  

在实践中,为什么这有用?

例如,假设您有这个整数流,并且您正在进行过滤:

int x = IntStream.of(1, -3, 5)
                 .filter(x -> x % 2 == 0)
                 .findFirst(); //hypothetical assuming that there's no Optional in the API

您事先并不知道过滤操作会删除Stream中的所有值。

假设API中没有Optional。在这种情况下,findFirst应该返回什么?

唯一可行的方法是抛出NoSuchElementException之类的异常,这是IMO相当恼人,因为我认为它不应该停止执行你的程序(或者你必须抓住它异常,也不是很方便)和过滤标准可能比这更复杂。

使用Optional时,由调用者来检查Optional是否为空(即如果您的计算结果是否为值)。

使用引用类型,您还可以返回null(但null可能是仅过滤null值的可能值;因此我们回到例外情况)。

关于非流量使用,除了防止NPE之外,我认为设计一个更明确的API也说明该值可能存在与否也是有帮助的。例如,考虑这个类:

class Car {
   RadioCar radioCar; //may be null or not 
   public Optional<RadioCar> getRadioCar() {
        return Optional.ofNullable(radioCar);
   }
}

在这里,您清楚地告诉来电者车内的收音机是可选的,可能是否存在。

答案 1 :(得分:16)

首次设计Java时,通常会使用一个特殊值,通常称为null来表示特殊情况,例如我无法找到您要查找的内容。这种做法被Java采用。

从那时起,有人建议将这种做法视为反模式,尤其是对象,因为这意味着您必须使用空检查来丢弃代码以实现可靠性和稳定性。例如,当您想将null放入集合时,这也是一种痛苦。

现代的态度是使用一种可能有或没有价值的特殊物品。这样你就可以安全地创建一个,而不是用任何东西填充它。在这里,您将看到Java 8通过提供Optional对象来鼓励这种最佳实践。

答案 2 :(得分:5)

它避免了必须创建繁琐的空检查,因为您始终知道返回了Optional对象。它也被流API大量使用。

答案 3 :(得分:1)

可选帮助您处理可用或不可用的变量,并避免检查空引用。