4 回答

TA貢獻1815條經驗 獲得超6個贊
這應該可以解決問題:
myMap.entrySet() ????.removeIf(e?->?e.getValue() ????????.stream() ????????.anyMatch(User::is50));
請注意,entrySet() 修改 (removeIf) 會影響條目集支持的映射。因此,您要么必須制作地圖的副本并在副本上運行它,要么讓第一個地圖 (?myMap
) 被修改。
至于制作地圖副本,您可以簡單地執行以下操作:
Map<String,?List<User>>?copy?=?new?HashMap<>(myMap);
就地刪除的更好方法如下:
myMap.values() ????.removeIf(v?->?v.stream() ????????.anyMatch(User::is50));
這更好的原因有四個:
getValue
您可以取消對since 的調用,因為values
它直接提供了值集。values
它更清楚地傳達意圖 -與價值之間的邏輯跳躍比entrySet
與價值之間的邏輯跳躍更少。它更簡潔并且不是反模式(例如,使用
peek
outside of debugging 是一種反模式,盡管有時更簡潔)。它仍然有效,因為返回的 Collection由 map
values
支持。

TA貢獻1770條經驗 獲得超3個贊
只需用于Stream::noneMatch
您的嵌套 Stream :
Map<String,?List<User>>?filteredMap?=?myMap.entrySet() ????????????????.stream() ????????????????.filter(e?->?e.getValue() ????????????????????????.stream() ????????????????????????.noneMatch(User::is50) ????????????????) ????????????????.collect(Collectors.toMap(Map.Entry::getKey,?Map.Entry::getValue)); filteredMap.forEach((key,?value)?->?System.out.println(key));
輸出是:
B C
在此解決方案myMap
中將不受影響,因為我stream
用完了entrySet
然后收集了它。Set::removeIf
會改變你以前的地圖,因為支持你原來的條目的Map::entrySet
返回。Set
Map

TA貢獻1898條經驗 獲得超8個贊
如您所見,您必須對 EntrySet 進行操作。您可以將其轉換為流并收集回新地圖,如下所示:
myMap.entrySet().stream() .filter(e -> e.getValue().stream().noneMatch(User::is50)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))

TA貢獻1828條經驗 獲得超4個贊
您可以使用 Map EntrySet 來解析您的地圖,然后解析每個條目中的列表
for (Map.Entry<String, List<User> entry : myMap.entrySet())
{
boolean toDelete = false;
for (User user : entry.getValue())
{
if (user.age == 50)
toDelete = true;
}
if (toDelete)
myMap.remove(entry.getKey());
}
添加回答
舉報