[英]How can I map an optional into a primitive optional?
我知道我可以將Optional
映射到另一個包裝類型可選。
Optional<Long> millis(Date date) {
return ofNullable(date).map(Date::getTime);
}
如何將map
或flatMap
map
到OptionalLong
?
OptionalLong millis(Date date) {
}
我試過但沒有運氣。
ofNullable(value).flatMap(v -> { // javac has never liked me
return OptionalLong.of(v.getTime());
});
您可以使用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();
}
請記住,如果您以任何方式涉及Optional<Long>
,您將在此方案中獲得性能提升。 來自Joshua Bloch的Effective Java,第3版 :
“返回包含盒裝基元類型的可選項與返回基元類型相比非常昂貴,因為可選項具有兩個級別的裝箱而不是零。[...]因此, 您永遠不應返回可選的盒裝基元類型 , “次要基本類型”, Boolean
, Byte
, Character
, Short
和Float
的可能例外“
沒有理由在這里涉及Optional
。 最好的解決方案是自己進行空檢查,然后返回一個OptionalLong
,例如
OptionalLong millis(Date date) {
return date == null ? OptionalLong.empty() : OptionalLong.of(date.getTime());
}
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();
}
我會按如下方式實現它:
OptionalLong toOptionalLong(Optional<Long> optionalValue) {
return optionalValue.map(OptionalLong::of).orElseGet(OptionalLong::empty);
}
當且僅當optionalValue
為空時,才調用OptionalLong::empty
函數。
但我不確定我是否會將Optional<Long>
強制轉換為OptionalLong
除非我真的有義務。 如前面的答案所述,在這種情況下,使用三元運算符可能是更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.