我有 Map<String, Object> currencyRate 包含
"license": "https:/etc",
"timestamp": 1654,
"base": "USD",
"rates": {
"AED": 3.6,
"AFN": 88.9,
"ALL": 112,
etc
}
例如,我想獲得 3.6 的“AED”值。我試過這個:
Map<String, Object> filtered = currencyRate.entrySet()
.stream()
.filter(map->map.getValue().toString().contains("AED"))
.collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()));
但它回傳了這個:
"rates": {
"AED": 3.6,
"AFN": 88.9,
"ALL": 112,
etc
}
所以“利率”是關鍵,它的價值也有關鍵和價值。如何在“rates”中獲取鍵和值?
uj5u.com熱心網友回復:
您不需要為此使用流。相反,您需要通過其鍵獲取嵌套映射并將其型別轉換為適當的型別(請注意,這種轉換是不安全的): "rates"
double aedRate = ((Map<String, Double>) map.get("rates")).get("AED");
如果您想不惜一切代價利用流,那么首先您需要提取嵌套映射并將其從Object型別轉換為Map. 然后在其條目上創建一個流并使用目標鍵 "AED"過濾掉條目:
Map.Entry<String, Double> result =
((Map<String, Double>) map.get("rates")).entrySet().stream()
.filter(entry -> entry.getKey("AED"))
.findFirst()
.orElseThrow();
請注意,使用Object泛型型別并通過型別轉換進行操作并不是一個好習慣。a 的整體方法Map<String, Object>容易出錯且不可維護。如果您將應用程式中的資料保持適當的結構,您將永遠不會遇到這個問題。
uj5u.com熱心網友回復:
由于您使用的是每個值都可以是任何物件的映射Map<String, Object>(沒有宣告,所以我只是在這里假設),我想您可以使用findFirst終端操作,然后將回傳的值轉換為Map<String, Object>(我在這里使用了 Object也適用于值,因為問題中未指定資料型別)。
當然,這只能在嚴格的假設下應用,即在您的封閉地圖中只有一個包含“AED”的值(同樣,如果任何其他值可以包含“AED”,問題中沒有指定)。
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>(Map.of(
"license", "http:/etc",
"timestamp", 1654,
"base", "USD",
"rates", Map.of(
"AED", 3.6,
"AFN", 88.9,
"ALL", 112
// ...
)
));
Map<String, Object> mapRes = (Map<String, Object>) map.entrySet()
.stream()
.filter(entry -> entry.getValue().toString().contains("AED"))
.map(entry -> entry.getValue())
.findFirst()
.orElse(null);
System.out.println(mapRes);
}
輸出
{ALL=112, AED=3.6, AFN=88.9}
uj5u.com熱心網友回復:
我想您應該使用 flatMap() 將嵌套地圖轉換為新流。
Map<String, Object> filtered = currencyRate.entrySet()
.stream()
.filter(map->map.getValue().toString().contains("AED"))
.flatMap(map->map.stream())
.filter(...)
.collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()));
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486081.html
