可选与null。Java 8中Optional的目的是什么?
实际上,这为什么有用?
例如,假设您有以下整数流,并且正在执行过滤:
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返回什么?
唯一可能的方法是抛出一个异常,例如NoSuchElementException,这是IMO相当烦人的,因为我不认为它应该停止程序的执行(或者您必须捕获该异常,也不是很方便),并且过滤条件可能比这更复杂。
使用时Optional,由调用方检查a是否Optional为空(即,您的计算是否得出值)。
使用引用类型,您还可以返回null(但null在仅过滤null值的情况下可能是一个可能的值;因此我们回到异常情况)。
关于非流用法,除了防止NPE外,我认为这还有助于设计一个更明确的API,说明可能存在或不存在该值。例如,考虑此类:
class Car { RadioCar radioCar; //may be null or not public Optional<RadioCar> geTradioCar() {return Optional.ofNullable(radioCar); }}
在这里,您显然是在向呼叫者说,汽车中的收音机是可选的,它可能在或不在那里。
解决方法在Java 8中,您可以返回Optional而不是null。Java8文档说Optional是“一个可能包含也可能不包含非null值的容器对象。如果存在一个值,则isPresent()将返回true,而get()将返回该值。”
实际上,这为什么有用?另外,在任何情况下,使用null都是首选?性能如何?
相关文章:
1. javascript - nodejs函数返回值为undefined,不太明白为什么。2. java - android手机连接不可访问互联网的热点时,经常自动切换到其他网络上去,怎么不让它自动切换呢?3. java - C++ error C2678: 二进制“<<”: 没有找到接受“const std::ostream”类型的左操作数的运算符4. javascript - hi all,安装node-sass 遇到的问题5. javascript - nodejs 使用request-promise发送请求后返回结果无法获取。6. if条件 scity.value==’-1’7. javascript - express 中 promise 处理异常8. javascript - nidejs环境设置操作一直出现这种问题怎么解决?9. org.openqa.selenium.WebDriverException:等待驱动程序服务器启动时超时。生成信息:版本:“未知”,修订版:“未知”10. java 测试post请求 在body里面传递参数怎么设置,怎么接收

网公网安备