问题
在以下情况下,我需要从流中删除元素。如下伪代码示例:
map.entrySet().stream().filter(t -> t.getValue().equals("0")).
forEach(t -> map.remove(t.getKey()));
在Java 8之前的代码中,可以从迭代器中删除-在这里处理这种情况的最佳方法是什么?
答案
map.entrySet().removeIf(entry -> entry.getValue().equals("0"));
您不能使用流来执行此操作,但是可以使用其他新方法来执行此操作。
编辑:更好
map.values().removeAll(Collections.singleton("0"));
第一次回复。 跨过该线程,并认为如果其他人正在搜索,则进行更新。 使用流,您可以返回过滤后的地图<>或您真正喜欢的任何东西。
@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
如果要删除整个密钥,请使用:
myMap.entrySet().removeIf(map -> map.getValue().containsValue("0"));