在Java 8中,您可以返回Optional
而不是null
。 Java 8文档说可选是“容器对象,它可能包含或不包含非空值。如果存在值,isPresent()将返回true,get()将返回值。”
在实践中,为什么这有用?
此外,是否有优先使用null
的情况?性能怎么样?
答案 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)
可选帮助您处理可用或不可用的变量,并避免检查空引用。