簡體   English   中英

轉換地圖的最佳方式<Object, Optional<Object> &gt; 到地圖<Object, 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.

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