【问题标题】:How to remove an element of a HashMap whilst streaming (lambda)如何在流式传输时删除 HashMap 的元素(lambda)
【发布时间】:2014-07-11 14:49:30
【问题描述】:

我有以下需要从流中删除元素的情况。

map.entrySet().stream().filter(t -> t.getValue().equals("0")).
            forEach(t -> map.remove(t.getKey()));

在 Java 8 之前的代码中,可以从迭代器中删除 - 在这里处理这种情况的最佳方法是什么?

【问题讨论】:

    标签: java dictionary iterator java-stream


    【解决方案1】:
    map.entrySet().removeIf(entry -> entry.getValue().equals("0"));
    

    你不能用流来做到这一点,但你可以用其他新方法做到这一点。

    编辑:更好:

    map.values().removeAll(Collections.singleton("0"));
    

    【讨论】:

    • 这不会从 entrySet 中删除,而不是从地图本身中删除,还是会自动同步?
    • entrySet是一个视图;对它的更改会反映在地图中,反之亦然;它没有独立的存在。
    【解决方案2】:

    如果要删除整个密钥,请使用:

    myMap.entrySet().removeIf(map -> map.getValue().containsValue("0"));
    

    【讨论】:

      【解决方案3】:

      我认为这是不可能的(或者绝对不应该这样做),因为 Streams 希望有非迭代,如 here 所述

      如果您将流视为您的函数式编程构造泄漏到 Java 中,那么将支持它们的对象视为它们的函数式对应物,并且在函数式编程中您对不可变对象进行操作

      处理这个问题的最好方法是像你一样使用过滤器

      【讨论】:

        【解决方案4】:

        第一次回复。跑过这个线程并认为如果其他人正在搜索则更新。使用流,您可以返回过滤后的 map 或您真正喜欢的任何内容。

          @Test
          public void test() {
        
            Map<String,String> map1 = new HashMap<>();
            map1.put("dan", "good");
            map1.put("Jess", "Good");
            map1.put("Jaxon", "Bad");
            map1.put("Maggie", "Great");
            map1.put("Allie", "Bad");
        
            System.out.println("\nFilter on key ...");
            Map<String,String> map2 = map1.entrySet().stream().filter(x -> 
            x.getKey().startsWith("J"))
                .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
        
            map2.entrySet()
              .forEach(s -> System.out.println(s));
        
            System.out.println("\nFilter on value ...");
            map1.entrySet().stream()
              .filter(x -> !x.getValue().equalsIgnoreCase("bad"))
              .collect(Collectors.toMap(e -> e.getKey(),  e -> e.getValue()))
              .entrySet().stream()
              .forEach(s -> System.out.println(s));
          }
        
        ------- output -------
        
        Filter on key ...
        Jaxon=Bad
        Jess=Good
        
        Filter on value ...
        dan=good
        Jess=Good
        Maggie=Great
        
        

        【讨论】:

          猜你喜欢
          • 2022-09-27
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 2020-02-28
          • 1970-01-01
          • 1970-01-01
          • 2019-07-28
          • 1970-01-01
          相关资源
          最近更新 更多