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

时间:2015-01-31 07:16:34

标签: java lambda optional

我知道我可以将Optional映射到另一个可选的包装器类型。

Optional<Long> millis(Date date) {
    return ofNullable(date).map(Date::getTime);
}

我如何mapflatMap加入OptionalLong

OptionalLong millis(Date date) {
}

我试过但没有运气。

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

4 个答案:

答案 0 :(得分:7)

您可以使用map获取Optional<OptionalLong>,然后orElse删除外部Optional,如下所示:

OptionalLong millis(Date date) {
    return Optional.ofNullable(date).map(Date::getTime)
            .map(OptionalLong::of).orElse(OptionalLong.empty());
}

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

OptionalLong millis(Date date) {
    return date == null ? OptionalLong.empty() : OptionalLong.of(date.getTime());
}

或者如果您已经拥有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();
}

答案 1 :(得分:2)

请注意,如果您以任何方式参与Optional<Long>在此方案中受到性能影响。来自Joshua Bloch的 Effective Java,3rd Edition

&#34;与返回基元类型相比,返回包含盒装基元类型的可选项非常昂贵,因为可选项具有两个级别的装箱而不是零。 [...]因此你永远不应该返回一个盒装基元类型的可选项,除了&#34;次要基元类型,&#34; BooleanByteCharacterShortFloat&#34;

没有理由在这里涉及Optional。最好的解决方案是自己进行空值检查,然后返回OptionalLong,例如

OptionalLong millis(Date date) {
    return date == null ? OptionalLong.empty() : OptionalLong.of(date.getTime());
}

答案 2 :(得分:1)

使用StreamEx library

OptionalLong millis(final Date date) {  
   return StreamEx.ofNullable(date).mapToLong(Date::getTime).findAny();
}

OptionalLong toLong(Optional<Long> o) {
    return  StreamEx.of(o).mapToLong(Long::longValue).findAny();
}

OptionalLong toLong(final Optional<Date> o) {
    return StreamEx.of(o).mapToLong(Date::getTime).findAny();
}

答案 3 :(得分:1)

我会按如下方式实现它:

OptionalLong toOptionalLong(Optional<Long> optionalValue) {
    return optionalValue.map(OptionalLong::of).orElseGet(OptionalLong::empty);
}

当且仅当OptionalLong::empty为空时才调用函数optionalValue

但是我不确定我会Optional<Long>加注OptionalLong,除非我真的有义务。如前面的答案所述,在这种情况下,使用三元运算符可能是更好的方法。