簡體   English   中英

Java Map Lambda異常

[英]Java Map Lambda Exception

我有一個帶有某些鍵的映射列表,這些鍵映射到String值。

類似於List<Map<String,String>> aMapList;

目標 :流式傳輸此地圖列表,並收集所有地圖中單個鍵的值。

我怎么做->

key = "somekey";
aMapList.stream().map(a -> a.get(key)).collect(Collectors.averagingInt());

問題:如果沒有這樣的密鑰,我會由於 a.get(key) 獲得異常! 因為將其取平均值將為空。 如何檢查或使lambda忽略任何此類地圖並繼續前進。

我確實知道我可以在a -> a.contains(key)上添加一個過濾器,然后繼續。 編輯:我還可以添加更多過濾器,也可以在一個過濾器上簡單檢查多個條件。 可能的解決方案:

    aMapList.stream().filter(a -> a.contains(key)).
         map(a -> a.get(key)).collect(Collectors.averagingInt());

可以更漂亮嗎? 除了停止操作,還可以跳過它們嗎? 是否有一些更通用的方法可以跳過異常或空值。 例如。 我們可以擴展lambda並放置一個try-catch塊,但是我仍然需要返回一些內容,如果我想做一個等效的“ continue”,該怎么辦。

例如。

(a -> {return a.get(key) }).

可以擴展到->

(a -> {try{return a.get(key)} 
catch(Exception e){return null} }).

上面的代碼仍然返回null,而不僅僅是跳過。

我正在為給出兩個選項選擇最佳答案,但是我發現其中沒有一個更漂亮。 鏈接過濾器似乎是解決此問題的方法。

如何使用Optional包裝結果:

List<Optional<String>> values = aMapList.stream()
            .map(a -> Optional.ofNullable(a.get(key)))
            .collect(Collectors.toList());

以后的代碼將知道可能會出現空元素。


您建議的解決方案對於允許null值的映射可能存在錯誤。 例如:

Map<String, String> aMap = new HashMap<>();
aMap.put("somekey", null);

aMapList.add(aMap);

aMapList.straem()
    .filter(a -> a.contains("somekey")) // true returned for contains
    .map(a -> a.get("somekey")) // null returned for get
    .collect(Collectors.toList());

根據地圖文檔以及您對問題的評論,您實際上並沒有從a.get(key)那里獲得異常。 相反,該表達式會產生一個空值,並且稍后遇到這些空值時會遇到問題。 因此,只需立即過濾掉這些空值就可以了:

aMapList.stream()
    .map(a -> a.get(key))
    .filter(v -> v != null)
    .collect(Collectors.toList());

這比問題中的解決方法更漂亮,更簡單,並且性能更好。

我應該提到的是,在處理空值時,我通常更喜歡使用Optional<>類型,但是這種過濾方法在這種情況下效果更好,因為您明確表示要忽略映射列表中不存在該鍵的元素。

我能想到的最簡單的是:

aMapList.stream()
        .filter(map -> map.containsKey(key))
        .map(map -> map.get(key))
        .collect(Collectors.toList());

通過以這種方式格式化lambda,可以更輕松地看到代碼處理的各個步驟。

盡管我認為這並不是一種更漂亮的方法,但是您可以這樣做:

aMapList.stream().map(a -> a.containsKey(key) ? a.get(key) : null).collect(Collectors.toList());

暫無
暫無

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

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