为什么.filter无法从我的Map <String,Object>中删除空值

Pre*_*ium 2 java linkedhashmap java-8 java-stream

我正在尝试从我的LinkedHashMap中过滤出不必要的null值。但是,实际上并没有删除这些值。

变量声明

Map<String,Object> dataDictionary = new LinkedHashMap<>();
Run Code Online (Sandbox Code Playgroud)

使用filter方法后,在sysout.print(dataDictionary)返回的内容的一小部分。

[industryCodes=<null>,regionCodes=<null>,andKeywords=false,id= 
<null>,resultsPerPage=20,keywords=<null>,omitKeywords=<null>}
Run Code Online (Sandbox Code Playgroud)

Java代码

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

期望空值及其键将被删除,但这似乎没有发生。

Amo*_*len 6

您在做什么完全没有必要。以下内容足以删除所有null值:

dataDictionary.values().removeIf(Objects::isNull);
Run Code Online (Sandbox Code Playgroud)

不需要流等。

编辑:这是我测试过的代码:

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);
Run Code Online (Sandbox Code Playgroud)

输出: {regionCodes=test, resultsPerPage=21}

removeIf注释掉该行后,我得到:{industryCodes=null, regionCodes=test, omitKeywords=null, resultsPerPage=21}

似乎为我工作。

也许您的值有问题,但实际上它们不是null吗?

Edit2:如Holger所建议,在Java 8之前,您可以使用以下代码:

dataDictionary.values().removeAll(Collections.singleton(null));
Run Code Online (Sandbox Code Playgroud)

  • 或者在Java 8之前:`dataDictionary.values()。removeAll(Collections.singleton(null));` (2认同)