![](/img/trans.png)
[英]Existing way to Java map Optional<> onto object instead of to another object?
[英]Best way to convert Map<Object, Optional<Object>> to Map<Object, Object>?
我正在兩組 API 之間構建一個我無法控制的層(即,即使這不是執行此操作的最佳選擇,但我無法更改合同)。 它接受一個哈希映射,該映射為我提供<Object, Optional<Object>>
,對該哈希映射進行一些處理,然后返回修改后的<Object, Object>
哈希映射以供其他服務使用。
從可選中提取值並在該可選為空時拋出錯誤的最佳方法是什么? 現在我有:
itemsMap.forEach((key, value) -> value.map(Optional::of).orElseThrow(() ->
new WhateverMyExceptionIs("Exception Message")));
但這並沒有將可選項轉換為可選項的值。
尚不清楚您想要的結果是什么,尤其是在Optional
之一為空的情況下,您想要的結果並不完全清楚。 對於此代碼片段,我假設您希望將這些條目排除在外。
Map<Object, Optional<Object>> originalMap = Map.of("Key 1", Optional.of(Integer.valueOf(2)),
Integer.valueOf(3), Optional.empty(),
"Key 4", Optional.of("Value 4"));
Map<Object, Object> targetMap = originalMap.entrySet()
.stream()
.filter(e -> e.getValue().isPresent())
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().orElseThrow()));
System.out.println(targetMap);
輸出是:
{鍵 1=2,鍵 4=值 4}
我通常告訴人們避免Optional.isPresent()
作為低級別。 在這種情況下,我會使用它。 就我而言,我不認為這是糟糕的代碼,而是正如您所說的那樣,這是糟糕的 API 設計的標志。
如果您不想使用Optional.isPresent()
,有一種方法可以不用它。 恕我直言,代碼變得不那么可讀:
Map<Object, Object> targetMap = originalMap.entrySet()
.stream()
.flatMap(e -> e.getValue().stream().map(v -> Map.entry(e.getKey(), v)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
結果和之前一樣。
如果輸出映射具有相同的類型,您可以使用replaceAll
覆蓋原地的值。
由於輸入和輸出映射具有不同的類型,您可以使用流來映射條目並創建新映射:
Map<Object, Object> newMap = itemsMap
.entrySet()
.stream()
.collect(Collectors.toMap(
e -> e.getKey(),
e -> e.getValue().orElseThrow(
() -> new WhateverMyExceptionIs("Exception Message")
)
));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.