Почему .filter не удаляет пустые значения из моей карты <String, Object> - PullRequest
2 голосов
/ 25 апреля 2019

Я пытаюсь отфильтровать ненужные нулевые значения из моей LinkedHashMap. Однако на самом деле эти значения не удаляются.

Объявление переменной

Map<String,Object> dataDictionary = new LinkedHashMap<>();

Небольшая часть того, что возвращается, когда я sysout.print (dataDictionary) после использования метода фильтра.

[industryCodes=<null>,regionCodes=<null>,andKeywords=false,id= 
<null>,resultsPerPage=20,keywords=<null>,omitKeywords=<null>}

Java-код

dataDictionary= dataDictionary.entrySet()
            .stream()
            .filter(entry -> entry.getValue()!=null)
            .collect(Collectors.toMap(Map.Entry::getKey,
                            Map.Entry::getValue));

Ожидается удаление нулевых значений и их ключей, но, похоже, этого не происходит.

1 Ответ

6 голосов
/ 25 апреля 2019

То, что вы делаете, совершенно не нужно.Для удаления всех значений null достаточно:

dataDictionary.values().removeIf(Objects::isNull);

Нет необходимости в потоках и т. П.

Редактировать: Вот код, который я тестировал:

Map<String,Object> dataDictionary = new LinkedHashMap<>();
dataDictionary.put("industryCodes", null);
dataDictionary.put("regionCodes", "test");
dataDictionary.put("omitKeywords", null);
dataDictionary.put("resultsPerPage", 21);
dataDictionary.values().removeIf(Objects::isNull);
System.out.println(dataDictionary);

Вывод: {regionCodes=test, resultsPerPage=21}

С закомментированной строкой removeIf я получаю: {industryCodes=null, regionCodes=test, omitKeywords=null, resultsPerPage=21}

Кажется, что работает для меня.

Может быть, что-то не так с вашими значениями, и они на самом деле не равны нулю?

Edit2: Как предполагает Holger, до Java 8 вы можете использовать следующее:

dataDictionary.values().removeAll(Collections.singleton(null));
...