2017-06-08 66 views
2

我在Java中有最終的ConcurrentMap,並且想要過濾它的元素而不創建新的元素。在lambda中過濾Java集合w/o創建新集合

問題是:我可以參考集合()從lambda?

final ConcurrentMap<String, String> people = new ConcurrentHashMap<>(); 
people.put("Sam", "developer"); 
people.put("Kate", "tester"); 

people.forEach((name, role) -> { 
    if (name.length() > 3) 
     people.remove(name); 
}); 

回答

3

.keySet().values().entrySet()分別返回地圖的鍵,值和條目的生活意見。您可以刪除這些集合和相應的條目要素從地圖中刪除:

people.keySet().removeIf(name -> name.length() > 3); 
3

這樣的討論就在最近,例如here

的文檔指出CHM提供弱一致遍歷,而不是快速失敗的遍歷;如看到here這意味着:

他們可以同時進行,這樣可以保證穿越元素,因爲他們在施工中存在恰好一次等操作

出發,可能(但並不保證)反映了建設後的任何修改

通常CHM改變它的結構的操作是線程安全的,但是你想達到的目的仍然受到Stream文檔的阻礙。這稱爲干擾應該避免。如果使用簡單的HashMap更改該結構,您將獲得ConcurrentModificationException,因爲您在遍歷源時正在修改源。除非你有一個令人信服的理由不放棄你以前的地圖,否則你應該過濾你感興趣的值並收集這些值。

您還可以看到如何從上面的鏈接中將添加到CMH以獲得不想要的結果。