![](/img/trans.png)
[英]How to add elements to a LinkedList that is contained within a HashMap?
[英]Deleting items the Lists contained within a HashMap
我有一個Hashmap<Long, List<Foo>> myMap
。 我想從任何List<Foo>
中刪除一個項目,其中Foo.key
等於分配給key
變量的值。
有沒有用流來做到這一點的好方法? 我正在使用以下代碼刪除該項目,這對我來說似乎不是最好的:
for (List<Foo> l : myMap.values()) {
for (Foo f : l) {
if (f.getKey().equals(key)) {
l.remove(f);
break;
}
}
}
可能有多種方法可以做到這一點。 這是一個:
myMap.values().forEach(list->list.removeIf(foo -> Objects.equals(foo.getKey(), key)));
這個想法是 go 在 map 中的每個列表上,並刪除具有要刪除的鍵的元素。
您擁有的代碼實際上是完成此任務的最合適工具。
既然需要修改map的內容,那就意味着需要一個stream,會產生副作用。 Stream API 的文檔不鼓勵這樣做。
但是您可以通過使用添加到Collection
接口的removeIf()
方法來增強您的代碼Java-8 。
public static void removeFooWithKey(Map<Long, List<Foo>> myMap,
String key) {
for (List<Foo> foos : myMap.values()) {
foos.removeIf(foo -> foo.getKey().equals(key));
}
}
最簡單的方法是:
myMap.values().forEach(list -> list.removeIf(foo -> foo.getKey().equals(key)))
但是removeIf會刪除此集合中滿足給定謂詞的所有元素。 它不等於您的初始代碼。 可能如果您的集合包含唯一鍵並且您只需要刪除一個 object removeIf
會做一點開銷並比較集合的所有元素。
解決方案 1. 按第一個匹配的索引刪除
myMap.values().forEach(list -> IntStream.range(0, list.size()).filter(index -> key.equals(list.get(index).getKey())).findFirst().ifPresent(list::remove))
解決方案 2. 自己的 removeFirstIf 方法
myMap.values().forEach(list -> StreamUtils.removeFirst(list, foo -> key.equals(foo.getKey())));
public class StreamUtils {
private StreamUtils() {
}
public static <T> T removeFirstIf(Iterable<? extends T> collection, Predicate<? super T> condition) {
Objects.requireNonNull(collection);
Objects.requireNonNull(condition);
T value;
final Iterator<? extends T> iterator = collection.iterator();
while (iterator.hasNext()) {
value = iterator.next();
if (condition.test(value)) {
iterator.remove();
return value;
}
}
return null;
}
}
解決方案 3. 將您的結構更改為 Map<Long, Map<String, Foo>>
假設:如果您的 List 可能由唯一鍵組成,那么您可以將結構從Map<Long, List<Foo>>
更改為Map<Long, Map<String, Foo>>
通過Key
刪除元素將簡單快速:
Map<Long, Map<String, Foo>> myMapOfMaps = new HashMap<>();
myMapOfMaps.values().forEach(map -> map.remove(key));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.