在Java 8中,您可以返回Optional而不是a null.Java 8文档说可选是"容器对象,可能包含也可能不包含非空值.如果存在值,isPresent()将返回true,get()将返回值."
在实践中,为什么这有用?此外,是否有任何null优先使用的情况?性能怎么样?
Ale*_* C. 35
在实践中,为什么这有用?
例如,假设您有这个整数流,并且您正在进行过滤:
int x = IntStream.of(1, -3, 5)
.filter(x -> x % 2 == 0)
.findFirst(); //hypothetical assuming that there's no Optional in the API
Run Code Online (Sandbox Code Playgroud)
您事先不知道过滤器操作将删除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);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,你清楚地告诉呼叫者,车内的收音机是可选的,它可能是或不存在.
Old*_*eon 18
当Java最初设计时,通常的做法是使用一个特殊的值,通常被称为null表示特殊情况,比如我找不到你想要的东西.这种做法被Java采用.
从那时起,有人建议将这种做法视为反模式,尤其是对象,因为这意味着您必须使用空检查来丢弃代码以实现可靠性和稳定性.例如,当你想要null收集一个集合时,这也是一种痛苦.
现代的态度是使用一种可能存在或不存在价值的特殊物体.这样你就可以安全地创建一个,而不是用任何东西填充它.在这里,您将看到Java 8通过提供Optional对象来鼓励这种最佳实践.
因为您总是知道Optional返回了一个对象,所以它避免了创建繁琐的null检查。流API也大量使用了它。
| 归档时间: |
|
| 查看次数: |
29969 次 |
| 最近记录: |