簡體   English   中英

刪除 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.

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