Java 8 引入的一个新类 java.util.Opitonal。这是一个封装 Optional值的类。举个例子,假设一个人可能有车也可能没有车,那么我们在声明Person类里的 car 属性时,就不应直接声明为【Car car】,而是声明为Optional 类型。
Optional 类只是对Car进行简单的封装,并未改变Car任何东西,当Car 不存在时,就是一个空的 Optional 对象,可调用方法 Optional.empty() 返回
使用 Optional 替代 null,当我们使用 Optional 包装一个对象时,就说明这个对象可能是缺失的。
在实际开发中,当我们知道一个方法的返回值可能出现 null 时,可以使用Optional 包装返回值。当其他人在调用这个方法时,就能够意识到这个返回值是可能为空的,并且一定会去处理这种情况
2.1 get()
获取 Optional 类里面的对象,如果没有,报“java.util.NoSuchElementException: No value present”
2.2 orElse(T other)
如果Optional 对象不包含值,则提供一个默认值
2.3 orElseGet(Supplier<? extends T> other)
该方法是 orElse方法的延迟调用版,Supplier 方法只有在 Optional对象不包含值才执行调用
2.4 orElseThrow(Supplier<? extends X> exceptionSupplier)
和get() 方法类似,如果 Optional 不包含值会抛出异常,不过使用orElseThrow()可以定制抛出的异常
2.5isPresent()
判断变量是否存在,返回一个boolean值
2.6 ifPresent(Consumer<? super T> consumer)
接受一个Consumer接口,如果对象存在,则将该对象作为参数传入Consumer处理
2.7 使用 map() 从 Optional对象中提取值
@Test public void test23(){ Apple redApple = new Apple(21, "red"); Optional<Apple> apple = Optional.of(redApple); // 从 Apple对象获取color,仍然返回一个Optional Optional<String> str = apple.map(Apple::getColor); }2.8 filter(Predicate<? super T> predicate)
如果值存在并且满足提供的谓词,就返回包含该值得 Optional 对象;否则返回一个空的 Optional对象
@Test public void test24(){ Apple redApple = new Apple(21, null); Optional<Apple> apple = Optional.of(redApple); Optional<Apple> a2 = apple.filter(a -> a.getSize() > 10); }