可选与空。Java 8 中 Optional 的用途是什么?
在 Java 8 中,您可以返回 一个而不是 .Java 8 文档说 Optional 是“一个容器对象,它可能包含也可能不包含非空值。如果存在值,isPresent() 将返回 true,get() 将返回该值。Optional
null
在实践中,为什么这很有用?另外,是否有任何情况下最好使用?性能如何?null
在 Java 8 中,您可以返回 一个而不是 .Java 8 文档说 Optional 是“一个容器对象,它可能包含也可能不包含非空值。如果存在值,isPresent() 将返回 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
您事先不知道筛选器操作将删除流中的所有值。
假设 API 中没有可选。在这种情况下,应该返回什么?findFirst
唯一可能的方法是抛出一个异常,例如,这是IMO相当烦人的,因为我认为它不会停止程序的执行(或者你必须捕获异常,也不是很方便),并且过滤条件可能比这更复杂。NoSuchElementException
使用 ,由调用方检查 是否为空(即您的计算是否生成了值)。Optional
Optional
使用引用类型,也可以返回(但在仅筛选值的情况下可能是值;因此我们返回到异常情况)。null
null
null
关于非流用法,除了防止NPE之外,我认为设计一个更明确的API也有助于设计一个更明确的API,说明该值可能存在或不存在。例如,考虑以下类:
class Car {
RadioCar radioCar; //may be null or not
public Optional<RadioCar> getRadioCar() {
return Optional.ofNullable(radioCar);
}
}
在这里,您清楚地对呼叫者说,车内的无线电是可选的,它可能在那里,也可能不存在。
当Java被首次设计时,通常使用特殊值,通常调用它来指示特殊情况,例如我找不到您要查找的内容。Java采用了这种做法。null
从那时起,有人建议这种做法应该被认为是一种反模式,特别是对于对象,因为这意味着你必须用空检查来乱扔代码来实现可靠性和稳定性。例如,当您想放入集合中时,这也是一种痛苦。null
现代的态度是使用一种特殊的物体,它可能具有或可能不具有价值。通过这种方式,您可以安全地创建一个,并且不会用任何东西填充它。在这里,您可以看到 Java 8 通过提供对象来鼓励这种最佳实践。Optional