簡體   English   中英

Java 可選 - 如何將一種類型的列表轉換為另一種類型

[英]Java Optional - How to convert one type of list to another

我有一個可選的Optional<TypeA> ,我可以從中執行map function 並獲得Optional<List<TypeB>>

但我想現在 map 到Optional<List<TypeC>>然后orElse()它。 所以輸入偽代碼

Optional.ofNullable(fooReturnsTypeA()).map(TypeA::barReturnsListTypeB()).{?}.orElse(new ArrayList<TypeC>());

我知道如何使用map function,但是用map處理Optional已經有一段時間了。 所以,我可能只是盯着答案看。 有人可以幫我解決{?}部分嗎?

問候,

那這個呢?

Optional.ofNullable(fooReturnsTypeA())
    .map(TypeA::barReturnsListTypeB())
    .map(typeBList->typeBList
        .stream()
        .map(TypeB::barReturnsTypeC)
        .collect(Collectors.toList())
    )
    .orElse(new ArrayList<TypeC>())

這基本上在.map Stream使用它將TypeB的所有元素轉換為TypeC (假設TypeB有一個方法barReturnsTypeC沒有返回TypeC實例的參數)。

您可以使用另一個map和 write 方法將List<TypeB>轉換為List<TypeC>

您的代碼將如下所示:

    Optional.ofNullable(fooReturnsTypeA())
    .map(TypeA::barReturnsListTypeB())
    .map(this::convert)
    .orElse(new ArrayList<TypeC>());

以及您的轉換方法:

    private List<TypeC> convert(List<TypeB> list) {
    // conversion logic
    // return List<TypeC>
}

首先,我會將orElse替換為orElseGet 根據您的代碼,使用orElseGet而不是orElse可以提高性能。 即使Optional不為空,也會評估orElse的參數。 另一方面,僅當Optional為空時才評估orElseGet的參數。 在您的特定情況下,您可能正在實例化不必要的ArrayList s。 來自 Javadoc:

作為參數傳遞的供應商方法僅在不存在 Optional 值時執行。

您還可以通過在map中使用stream來關閉{?}

Optional.ofNullable(fooReturnsTypeA())
    .map(typeA -> typeA.barReturnsListTypeB().stream()
            .map(TypeB::barReturnsTypeC).collect(Collectors.toList()))
    .orElseGet(() -> new ArrayList<TypeC>());

注意:有關orElseorElseGet之間區別的更多信息,請參閱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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