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

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

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

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

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

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

您事先不知道filter操作将删除Stream中的所有值。

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

唯一可能的方法是抛出一个exception,比如NoSuchElementException ,这对IMO来说很烦人,因为我觉得它不应该停止执行你的程序(或者你必须捕获exception,也不是很方便)过滤标准可能比这更复杂。

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

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

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

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

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

当Java最初设计时,通常的做法是使用一个特殊的值,通常称为null来表示我找不到你想要的特殊情况。 这种做法被Java采用。

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

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

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

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