2010-07-19 76 views
45

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

例如:[null, 30, null]

想回:[30]

+1

搞笑的人问起最初的空位是如何进入名单的。似乎你可能正在解决症状而不是问题。 – Snekse 2015-01-28 23:13:37

回答

59

这里是一个答案,如果你不想保持原来的列表

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

    list.removeAll([null]) 

    assertEquals 1, list.size() 
    assertEquals 30, list.get(0) 
} 

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

+1

+1为最可读的解决方案(读取如:“删除所有空值”) – 2010-07-19 21:40:19

44

该方法的findAll应该做你所需要的。

​[null, 30, null]​.findAll {it != null}​ 
+7

+1对于不改变原始列表的 – 2010-07-19 21:38:44

+1

'[null,30,null] .findAll {it}'将执行的解决方案。 – 2012-12-21 09:56:16

+4

Thomas,findAll {it}将删除0以及null。如果这就是你想要的,那么你可能只是做一个findAll() – 2013-02-02 16:00:47

102

只需使用减:

[null, 30, null] - null 
+0

这看起来很简单,很好,并帮助我 – 2014-09-21 07:59:58

+4

+1最佳答案! – 2014-11-17 13:48:08

+3

也可以使用[null,30,null] .minus(null)。这对我来说似乎更易读。版本' - '提醒SBT操作员滥用。 – 2015-12-08 19:50:03

9

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

println([null, 30, null].findAll()) 

公共类别的findAll()查找匹配IDENTITY 封闭的物品(即匹配Groovy的真相)。例如:

def items = [1,2,0,false,true,'','foo',[],[4,5],null] assert items.findAll()== [1, 2,真正的, '富',[4,5]

2

简单[null].findAll{null != it}如果it为null,则它,所以它不会在新的集合存在返回false。

+1

'assertEquals [],[0,false,null] .findAll {it}' – 2014-11-26 11:55:46

+0

你是对的,谢谢。 – 2014-11-26 13:43:49

4

这也可以通过grep实现:

assert [null, 30, null].grep()​ == [30]​ 

assert [null, 30, null].grep {it}​ == [30]​ 

assert [null, 30, null].grep { it != null } == [30]​ 
1

另一种方式来做到这一点是[null, 20, null].findResults{it}

1

这确实一个到位去除所有的空项。

myList.removeAll { !it } 

如果数字0是在你的域名,你可以核对空

myList.removeAll { it == null }