FlatMap

flatMap 类似于 map 。javadoc 描述的差异如下:

这个方法类似于 map(Function),但提供的映射器是一个结果已经是 Optional 的映射器,如果被调用,flatMap 不会用额外的 Optional 包装它。

换句话说,当你链接一个返回 Optional 的方法调用时,使用 Optional.flatMap 可以避免创建嵌套的 Optionals

例如,给定以下类:

public class Foo {
    Optional<Bar> getBar(){
        return Optional.of(new Bar());
    }
}

public class Bar {
}

如果你使用 Optional.map,你会得到一个嵌套的 Optional; 即 Optional<Optional<Bar>>

Optional<Optional<Bar>> nestedOptionalBar =
    Optional.of(new Foo())
        .map(Foo::getBar);

但是,如果你使用 Optional.flatMap,你会得到一个简单的 Optional; 即 Optional<Bar>

Optional<Bar> optionalBar =
    Optional.of(new Foo())
        .flatMap(Foo::getBar);