簡體   English   中英

如何將可選項映射到原始可選項?

[英]How can I map an optional into a primitive optional?

我知道我可以將Optional映射到另一個包裝類型可選。

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

如何將mapflatMap mapOptionalLong

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版

“返回包含盒裝基元類型的可選項與返回基元類型相比非常昂貴,因為可選項具有兩個級別的裝箱而不是零。[...]因此, 您永遠不應返回可選的盒裝基元類型 , “次要基本類型”, BooleanByteCharacterShortFloat的可能例外“

沒有理由在這里涉及Optional 最好的解決方案是自己進行空檢查,然后返回一個OptionalLong ,例如

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

使用StreamEx庫

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM