如何将可选项映射到原始可选项?

Jin*_*won 4 java lambda optional

我知道我可以映射Optional到另一个包装类型可选.

Optional<Long> millis(Date date) {
    return ofNullable(date).map(Date::getTime);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能mapflatMapOptionalLong

OptionalLong millis(Date date) {
}
Run Code Online (Sandbox Code Playgroud)

我试过但没有运气.

ofNullable(value).flatMap(v -> { // javac has never liked me
    return OptionalLong.of(v.getTime());
});
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 7

您可以使用map以获取Optional<OptionalLong>然后orElse删除外部Optional像这样:

OptionalLong millis(Date date) {
    return Optional.ofNullable(date).map(Date::getTime)
            .map(OptionalLong::of).orElse(OptionalLong.empty());
}
Run Code Online (Sandbox Code Playgroud)

另一种(在这种情况下更短)的方式是使用三元运算符:

OptionalLong millis(Date date) {
    return date == null ? OptionalLong.empty() : OptionalLong.of(date.getTime());
}
Run Code Online (Sandbox Code Playgroud)

或者如果您已经拥有Optional<Long>:

OptionalLong toOptionalLong(Optional<Long> o) {
    return o.map(OptionalLong::of).orElse(OptionalLong.empty());
}
OptionalLong toOptionalLong(Optional<Long> o) {
    return o.isPresent() ? OptionalLong.of(o.get()) : OptionalLong.empty();
}
Run Code Online (Sandbox Code Playgroud)