optional<T>对象是一种包装器对象,要么包装了类型T的对象,要么没有包装任何对象。对于第一种情况,我们称这种值是存在的。0ptional<T>类型被当作一种更安全的方式,用来替代类型T的引用,这种引用要么引用某个对象,要么为 null
1. 创建
Optional<Employee> optionalTest = Optional.of(new Employee(10002, "optional 测试"));
Optional<Object> empty = Optional.empty();
Object o1 = empty.get();
//java.util.NoSuchElementException: No value present
Optional<Object> o = Optional.ofNullable(null);
Object o1 = o.get();
//java.util.NoSuchElementException: No value present
2. 获取
它在值不存在的情况下会产生一个可替代物,而只有在值存在的情况下才会使用这个值
2.1. 在没有任何匹配时,我们会希望使用某种默认值
可能是空字符串:String result = optionalString.orElse("");
还可以调用代码来计算默认值:
String result = optionalString.orElseGet(()->System.getProperty("myapp.default"));
2.2. 或者可以在没有任何值时抛出异常
String result = optionalString.orElseThrow(IllegalStateException::new);
3. 消费
3.1. ifPresent 方法会接受一个函数。如果可选值存在,那么它会被传递给该函数。否则,不会发生任何事情
optionalValue.ifPresent(v -> Process v)
3.2. 如果想要在可选值存在时执行一种动作,在可选值不存在时执行另一种动作
optionalValue.ifPresentOrElse(
V -> System.out.printLn("Found"+ v), ()-> logger.warning("NO match"));
4. 管道化
Optional<String> transformed = optionalString.map(String::toUpperCase)
如果optionalString为空,那么 transformed 也为空
我们将一个结果添加到列表中,
如果optionalValue 为空,则什么也不会发生。
Optional<String> transformed = optionalString
.filter(s-> s.length()>= 8).map(String::tolUpper Case)
产生一个Optional,如果当前的 optional的值满足给定的谓词条件,那么所产生的optional 的值就是当前 Optional 的值;否则,产生一个空 optional
Optional<T> or(Supplier<? extends optional<? exatends T>> supplier) 9
如果当前 optional 不为空,则产生当前的 optional;否则由 supplier产生一个optional
5. 收集
map(Function f)
flatMap(Function mapper)