为什么.filter没有从我的Map中删除空值

问题描述 投票:2回答:1

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

变量声明

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

使用filter方法后,当我使用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));

期望删除空值及其键,但这似乎不会发生。

java java-8 java-stream linkedhashmap
1个回答
6
投票

你正在做的事是完全没必要的。以下内容足以删除所有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));
© www.soinside.com 2019 - 2024. All rights reserved.