Подтвердить что ты не робот

Как удалить элемент HashMap во время потоковой передачи (лямбда)

У меня есть следующая ситуация, когда мне нужно удалить элемент из потока.

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

в коде pre Java 8, который можно удалить из итератора - какой лучший способ справиться с этой ситуацией здесь?

4b9b3361

Ответ 1

map.entrySet().removeIf(entry -> entry.getValue().equals("0"));

Вы не можете сделать это с помощью потоков, но вы можете сделать это с помощью других новых методов.

EDIT: еще лучше:

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

Ответ 2

Я думаю, что это невозможно (или deffinitelly не должно быть сделано) из-за желания Streams иметь Non-iterference, как описано здесь

Если вы думаете о потоках, когда ваши конструкторы функционального программирования просочились в Java, тогда подумайте об объектах, которые поддерживают их как их функциональных аналогах, и в функциональном программировании вы работаете с неизменяемыми объектами.

И для лучшего способа справиться с этим - использовать фильтр так же, как вы делали

Ответ 3

1 раз отвечаю. Пробежал по этой теме и подумал обновить, если другие ищут. Используя потоки, вы можете вернуть отфильтрованную карту <> или что угодно на самом деле.

  @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

Ответ 4

Если вы хотите удалить весь ключ, используйте:

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