2010-07-19 77 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 }