在 Java8中,可以返回 Optional而不是 null。Java8文档中说,an Options 是“一个可能包含或不包含非空值的容器对象。如果存在一个值,isCurrent ()将返回 true,get ()将返回该值。”
Optional
null
在实践中,这为什么有用? 还有,是否有使用 null更好的情况? 性能如何?
可选项可以帮助您处理可用或不可用的变量,并避免检查空引用。
在实践中,这为什么有用?
例如,假设你有一个整数流,你正在进行一个过滤:
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应该返回什么?
findFirst
唯一可能的方法是抛出一个异常,比如 NoSuchElementException,这个异常非常烦人,因为我认为它不应该停止程序的执行(或者你必须捕捉异常,也不是很方便) ,而且过滤条件可能比这更复杂。
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对象来鼓励这种最佳实践。