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);