如何过滤&#34; Null&#34;来自HashMap的值<string,string =“”>?

时间:2016-03-08 09:29:56

标签: java

在map之后,将键值对都作为String,写一个逻辑来过滤Map中的所有空值而不使用任何外部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 )  

3 个答案:

答案 0 :(得分:80)

您可以将Java 8方法Collection.removeIf用于此目的:

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

删除了所有null值。

Online demo

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

答案 1 :(得分:19)

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

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

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

  

[HashMap.values()]返回的集合支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从地图中删除相应的映射

可能更快的替代方法,因为您不必继续重新集合集合以查找第一个null元素:

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

或者你可以在没有显式迭代的情况下完成:

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

答案 2 :(得分:7)

将起作用

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