可选对空值。在 Java8中可选的目的是什么?

在 Java8中,可以返回 Optional而不是 null。Java8文档中说,an Options 是“一个可能包含或不包含非空值的容器对象。如果存在一个值,isCurrent ()将返回 true,get ()将返回该值。”

在实践中,这为什么有用? 还有,是否有使用 null更好的情况? 性能如何?

74978 次浏览

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

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

例如,假设你有一个整数流,你正在进行一个过滤:

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 中没有可选项。在这种情况下,findFirst应该返回什么?

唯一可能的方法是抛出一个异常,比如 NoSuchElementException,这个异常非常烦人,因为我认为它不应该停止程序的执行(或者你必须捕捉异常,也不是很方便) ,而且过滤条件可能比这更复杂。

通过使用 Optional,由调用方检查 Optional是否为空(即计算结果是否为值)。

使用引用类型,还可以返回 null(但是在只过滤 null值的情况下,null可能是一个值; 所以我们回到异常情况)。

关于非流使用,除了防止 NPE,我认为它还有助于设计一个更明确的 API,说明值是否存在。例如,考虑下面这个类:

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

在这里,你清楚地告诉打电话的人,车里的收音机是可选的,它可能在那里,也可能不在那里。

Java 最初被设计出来的时候,通常使用一个特殊的值,通常称为 null来表示特殊的情况,比如 我找不到你要找的东西。Java 采用了这种做法。

从那时起,就有人建议,这种做法应该被视为反模式,特别是对象,因为它意味着您必须在代码中添加空检查,以实现可靠性和稳定性。例如,当您想要将 null放入集合中时,这也是一个痛苦的过程。

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