2015-05-26 61 views
1

我知道,一旦我們從集合中創建流,我們就不應該在使用流時修改集合,但不確定以下方法在我修改地圖內的條目而不是添加或刪除任何東西。此外,這是正確的方式來流式地圖總是消耗它?在Java中對流圖進行流式處理並修改它8

creepyCategoryStatuses.entrySet().stream().forEach(entry -> { 
     String creepyBlockResponse = (String) getBlockResponse(entry.getKey()); 
     if (creepyBlockResponse.equalsIgnoreCase("block")){ 
      entry.setValue(true); 
     //OR creepyCategoryStatuses(entry.getKey(), true); 
     } 
    }); 

回答

4

這種修改是沒有問題的,因爲設置條目的值不是結構修改。不過,值得注意的是,有更多的Java 8功能比Stream API或forEach方法:

creepyCategoryStatuses.replaceAll((key,value)-> 
    ((String)getBlockResponse(key)).equalsIgnoreCase("block")||value 
); 

做這項工作要容易得多。請注意,||value將保留舊值,如果條件評估爲false與您的原始代碼一樣。

2

是的,這樣使用Map似乎是合法的。請注意,在這種情況下,您不需要流。你可以簡單地使用

creepyCategoryStatuses.entrySet().forEach(entry -> {...}); 
+0

當然,但以上述方式,在地圖上進行修改時可以修改條目嗎? – Kaunteya

+0

@霍爾是的,我明白你的觀點。我更新了我的代碼片段。 – Kaunteya

2

根據您的使用情況,您可以在這裏使用replaceAll

creepyCategoryStatuses.replaceAll((k, v) -> ((String) getBlockResponse(k)).equalsIgnoreCase("block") ? true : v); 

我總是青睞功能範式,所以我將收集新的數據到一個新的地圖,但這是一個品味問題。