从Groovy中的列表中删除空项

Rya*_*nch 53 groovy

从Groovy中的列表中删除空项的最佳方法是什么?

例如: [null, 30, null]

想要回归: [30]

小智 122

只需使用减号:

[null, 30, null] - null
Run Code Online (Sandbox Code Playgroud)

  • 也可以使用[null,30,null] .minus(null).这对我来说似乎更具可读性.带" - "的版本提醒SBT操作员滥用. (9认同)

hvg*_*des 74

如果您不想保留原始列表,这里是一个答案

void testRemove() {
    def list = [null, 30, null]

    list.removeAll([null])

    assertEquals 1, list.size()
    assertEquals 30, list.get(0)
}
Run Code Online (Sandbox Code Playgroud)

在一个方便的花花公子单元测试中


Chr*_*ail 49

findAll方法应该做你需要的.

?[null, 30, null]?.findAll {it != null}?
Run Code Online (Sandbox Code Playgroud)

  • +1表示不更改原始列表的解决方案 (7认同)
  • 托马斯,findAll {it}将删除0以及null.如果那是你想要的那么你也可以做一个findAll() (4认同)

Din*_*llu 11

我想你会发现这是最短的,假设你不介意其他"假"值也消失了:

println([null, 30, null].findAll())
Run Code Online (Sandbox Code Playgroud)

public Collection findAll()查找与IDENTITY Closure匹配的项目(即匹配Groovy真理).例:

def items = [1,2,0,false,true,'','foo',[],[4,5],null]断言items.findAll()== [1,2,true,'foo' ,[4,5]]


MKB*_*MKB 7

这也可以通过grep来实现:

assert [null, 30, null].grep()? == [30]?
Run Code Online (Sandbox Code Playgroud)

要么

assert [null, 30, null].grep {it}? == [30]?
Run Code Online (Sandbox Code Playgroud)

要么

assert [null, 30, null].grep { it != null } == [30]?
Run Code Online (Sandbox Code Playgroud)