Java 如何在流式处理时删除HashMap的元素(lambda)

Java 如何在流式处理时删除HashMap的元素(lambda),java,dictionary,iterator,java-stream,Java,Dictionary,Iterator,Java Stream,在以下情况下,我需要从流中删除一个元素 map.entrySet().stream().filter(t -> t.getValue().equals("0")). forEach(t -> map.remove(t.getKey())); 在Java 8之前的代码中,我们将从迭代器中删除—这里处理这种情况的最佳方法是什么?我认为这是不可能的(或者说不应该这样做),因为Streams希望具有非iterference,如前所述 如果您认为流是泄漏到Java中的

在以下情况下,我需要从流中删除一个元素

map.entrySet().stream().filter(t -> t.getValue().equals("0")).
            forEach(t -> map.remove(t.getKey()));
在Java 8之前的代码中,我们将从迭代器中删除—这里处理这种情况的最佳方法是什么?

我认为这是不可能的(或者说不应该这样做),因为Streams希望具有非iterference,如前所述

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

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

map.entrySet().removeIf(entry -> entry.getValue().equals("0"));
您不能使用流,但可以使用其他新方法

编辑:更好:

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

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

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

第一次回复。运行此线程,并认为如果其他人正在搜索,将进行更新。使用streams,您可以返回经过过滤的地图或任何您真正喜欢的内容

  @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

@测试
公开无效测试(){
Map map1=新的HashMap();
map1.put(“丹”、“好”);
map1.put(“Jess”,“Good”);
map1.put(“Jaxon”,“Bad”);
map1.put(“Maggie”,“Great”);
地图1.放置(“Allie”、“Bad”);
System.out.println(“\n键上的过滤器…”);
Map map2=map1.entrySet().stream().filter(x->
x、 getKey().startsWith(“J”))
.collect(Collectors.toMap(e->e.getKey(),e->e.getValue());
map2.entrySet()
.forEach->System.out.println;
System.out.println(“\n对值进行筛选…”);
map1.entrySet().stream()
.filter(x->!x.getValue().equalsIgnoreCase(“坏”))
.collect(Collectors.toMap(e->e.getKey(),e->e.getValue())
.entrySet().stream()
.forEach->System.out.println;
}
-------输出-------
按键筛选。。。
杰克森=坏
杰斯=好
按值筛选。。。
丹=好
杰斯=好
玛吉=太好了

这不会从入口集(而不是地图本身)中删除,还是会自动同步?入口集是一个视图;地图上反映了对它的更改,反之亦然;它没有独立的存在。