【问题标题】:Why is .filter not removing null values from my Map<String,Object>为什么 .filter 不从我的 Map<String,Object> 中删除空值
【发布时间】:2019-04-25 11:06:16
【问题描述】:

我正在尝试从我的 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));

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

【问题讨论】:

  • 你必须提供一些我们可以测试的东西,因为它是不可能回答的......来自你的value的一些individial属性是空的,但是不是价值本身,是吗?
  • 这不是null 的打印方式,所以我猜这是一个覆盖toString 的实例,它打印一个变量null,而实例本身不是。

标签: java java-8 java-stream linkedhashmap


【解决方案1】:

你所做的完全没有必要。以下内容足以删除所有 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));

【讨论】:

  • 我认为Amalalen 的回答是正确的。也许值不是null,而是带有toString()返回"&lt;null&gt;"的东西。
  • @PremiumAluminium 在我的答案中添加了测试代码,检查一下。
  • 我认为你可能是正确的关于值实际上不是空的。
  • 或者,在 Java 8 之前:dataDictionary.values().removeAll(Collections.singleton(null));
猜你喜欢
  • 2019-04-06
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多