[英]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>());
注意:有關orElse
和orElseGet
之間區別的更多信息,請參閱 此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.