【问题标题】:How to filter "Null" values from HashMap<String, String>? [duplicate]如何从 HashMap<String, String> 中过滤“Null”值? [复制]
【发布时间】:2016-03-08 09:29:55
【问题描述】:

下面的地图,有两个键值对作为字符串,编写一个逻辑来过滤地图中的所有空值而不使用任何外部API?

除了遍历整个地图并过滤掉值(遍历整个地图并获取条目对象并丢弃这些对)之外,还有其他方法吗?

        Map<String,String> map = new HashMap<String,String>();

        map.put("1", "One");
        map.put("2", "Two");
        map.put("3", null);
        map.put("4", "Four");
        map.put("5", null);
        //Logic to filer values
        //Post filtering It should print only ( 1,2 & 4 pair )  

【问题讨论】:

  • 不,没有。遍历(它只是一个循环)将在您的代码中或在 JDK 代码(流等)中,但需要有一个循环。
  • 如果你不想让null放在首位,你可以继承它并覆盖put方法。

标签: java


【解决方案1】:

您可以为此使用 Java 8 方法 Collection.removeIf

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

这删除了所有为空的值。

Online demo

这是因为为 HashMap 调用 .values() 返回一个集合,该集合将修改委托给 HashMap 本身,这意味着我们对 removeIf() 的调用实际上改变了 HashMap(这不适用于所有 java Map )

【讨论】:

  • 请解释如何以单行方法将 values() 转换回 hashmap,我只看到 values() 但无法取回?
  • 关键是你不需要把它转换回来,它就可以工作
  • 但是如果我希望在过滤掉空值的同时保留地图格式怎么办?当然我可以使用下面的解决方案(并且已经这样做了),但我认为你可以提供一种更简单的方法......对值......过滤......然后返回地图。无论如何,谢谢。
  • @vasilevich values() 是地图值的视图。如果您从中删除某些内容,它会从映射中删除相应的键/值对。
  • 我有一张这样的地图,上面的解决方案不起作用{first=null, self={href=/employee/1/employees}, next=null, last=null, prev=null}
【解决方案2】:

如果您使用的是 Java 8 之前的版本,则可以使用:

Collection<String> values = map.values();
while (values.remove(null)) {}

这是因为 HashMap.values() 返回值的视图,并且:

集合[HashMap.values()返回]支持元素移除,通过Iterator.remove、Set.remove、removeAll、retainAll和clear操作从map中移除对应的映射

另一种可能更快的方法,因为您不必不断重复集合来找到第一个空元素:

for (Iterator<?> it = map.values().iterator();
    it.hasNext();) {
  if (it.next() == null) {
    it.remove();
  }
}

或者你可以在没有显式迭代的情况下做到这一点:

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

【讨论】:

  • 感谢安迪的解决方案。我试过你的解决方案。它工作正常。
【解决方案3】:

会起作用的

Map<String, String> result = map.entrySet()
    .stream()
    .filter(e -> e.getValue() != null)
    .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

【讨论】:

  • 哦,对不起。这仅适用于流。我们可以在流之间进行转换,让我更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多