可选与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可帮助您处理可用或不可用的变量,并避免检查空引用。