在Java 8之前,要编写一个在特定环境下无奈返回任何值的办法时,有两种办法:要么抛出异样,要么返回null(假如这里返回类型是一个对象援用类型)。但这两种办法都不够完满。通常状况下异样应该依据异样条件保留下来,因为创立异样时会捕获整个堆栈轨迹,java培训抛出异样的老本很高;返回null则要求客户端必须蕴含非凡的代码来解决null值。

而在Java 8中,还有第三种办法能够编写不能返回值的办法。Optional<T>类代表的是一个不可变的容器,它能够寄存单个非null的T援用,或者什么内容都没有。通常不蕴含任何内容的Optional称为空,非空的Optional中的值称作存在。Optional实质上是一个不可变的汇合,最多只能寄存一个元素。Optional<T>没有实现Collection<T>接口,但原则上是能够的。

public T get(String id) {
if (StringUtils.isNullOrBlank(id)) {

return null;

}
return testService.get(id);
}

上述代码,当id传入空时,返回null。实践上所有能返回T的办法,都能够改成返回Optional<T>,比方:

public Optional<T> get(String id) {

if (StringUtils.isNullOrBlank(id)) {    return Optional.empty();}return Optional.ofNullable(testService.get(id));

}

如上所示,返回Optional是很简略的事,只有用适当的动态工厂创立Optional即可。在这里Optional.empty()返回一个空的Optional,Optional.ofNullable承受可能为null的值,当传入null值就返回一个空的Optional。但咱们须要记住的一点是:「永远不要通过返回Optional的办法返回null」,因为它彻底违反了Optional的本意。

如果办法返回Optional,客户端必须要做出抉择:如果该办法不能返回值时应该采取什么样的措施。抛出异样?提供默认值?

Optional提供isPresent()办法,它能够被当做是一个平安阈。当Optional中蕴含一个值时,它返回true;当Optional为空时,返回false。通常咱们能够这么应用:

Optional<Test> optional = testService.get(id);
if (optional.isPresent() == false) {

return;

}
Test test = optional.get();
// do something

当然Optional也提供orElse(T other)当值为空时,应用某个默认值的办法。

对于更多Optional的用法还请大家自行学习应用。

总而言之,如果发现自己在编写的办法始终无奈返回值,并且应用该办法的客户端每次在调用它时都要思考到这种可能性,那么或者就应该返回一个Optional。