首页 > 解决方案 > 从 Groovy 或 Java 中的复杂数据结构中删除空值

问题描述

我需要从复杂的 LinkedHashMap 中删除空键值:

这是一个简单的例子:
[f1:abc, f2:xyz, f3:lmn, test:null, people:[[name:James, City:Atlanta], [name:Rachel, City:null]], person:[name:James, Phone:4045555555, test:null]]
[f1:abc, f2:xyz, f3:lmn, people:[[name:James, City:Atlanta], [name:Rachel]], person:[name:James, Phone:4045555555]]

我已经到了一半,我只是坚持从列表(人)中删除空值。这是我到目前为止所拥有的:

def removeNullValues(Object map) {
    map.collectEntries { k, v -> [k, v instanceof Map? removeNullValues(v) : v]}
            .findAll { k, v -> v != null}
}

标签: recursiongroovydata-cleaninglinkedhashmap

解决方案


您可以使用多态性来选择不同的方法,具体取决于项目是列表、映射还是其他:

def input = [
   f1:'abc',
   f2:'xyz',
   f3:'lmn',
   test:null,
   woo:[1, 2, null, 3],
   people:[
      [name:'James', City:'Atlanta'],
      [name:'Rachel', City:null]
   ],
   person:[name:'James', Phone:'4045555555', test:null]
]

def removeNulls(other) {
    other
}

def removeNulls(List list) {
    list.findResults { removeNulls(it) }
}

def removeNulls(Map map) {
    map.findAll { k, v -> v != null }.collectEntries { k, v ->
         [k, removeNulls(v)]
    }
}

println removeNulls(input)

这将打印:

[f1:abc, f2:xyz, f3:lmn, woo:[1, 2, 3], people:[[name:James, City:Atlanta], [name:Rachel]], person:[name:James, Phone:4045555555]]

推荐阅读