我知道我可以将Optional
映射到另一个可选的包装器类型。
Optional<Long> millis(Date date) {
return ofNullable(date).map(Date::getTime);
}
我如何map
或flatMap
加入OptionalLong
?
OptionalLong millis(Date date) {
}
我试过但没有运气。
ofNullable(value).flatMap(v -> { // javac has never liked me
return OptionalLong.of(v.getTime());
});
答案 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; Boolean
,Byte
,Character
,Short
和Float
&#34;
没有理由在这里涉及Optional
。最好的解决方案是自己进行空值检查,然后返回OptionalLong
,例如
OptionalLong millis(Date date) {
return date == null ? OptionalLong.empty() : OptionalLong.of(date.getTime());
}
答案 2 :(得分:1)
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
,除非我真的有义务。如前面的答案所述,在这种情况下,使用三元运算符可能是更好的方法。