2010-01-04 91 views
3

我在試圖弄清楚如何將單個項目轉換爲列表的常規問題。我有一個傳入變量params.contacts,它可以是單個值(例如14),也可以是值的數組(例如14,15)。我想永遠把它變成一個列表。以前,我只是說params.contacts.toList(),但是這個代碼在單個項目時失敗。它將需要14的值並將其分成[1,4]的列表。Groovy列表轉換

有沒有簡單,優雅的方式來處理這個問題?

回答

8

一個簡單的方法,把它放在一個列表,並壓平:

def asList(orig) { 
    return [orig].flatten() 
} 

assert [1, 2, 3, 4] == asList([1, 2, 3, 4]) 
assert ["foo"] == asList("foo") 
assert [1] == asList(1) 

一個問題是,它會完全扁平化的東西,所以它不是因爲它會內拉平列出一個好方法您的列表:

assert [[1, 2], [3, 4]] == asList([[1, 2], [3, 4]]) // fails! 

另一種方法是使用類型系統,你的優勢:

def asList(Collection orig) { 
    return orig 
} 

def asList(orig) { 
    return [orig] 
} 

assert [1, 2, 3, 4] == asList([1, 2, 3, 4]) 
assert ["foo"] == asList("foo") 
assert [1] == asList(1) 
assert [[1, 2], [3, 4]] == asList([[1, 2], [3, 4]]) // works! 

這裏,我們讓類型系統爲我們做了所有的繁重工作。如果我們已經有了一個集合,就把它返回。否則,把它變成一個列表。像Java這樣的技巧現在仍然適用於我們,當它們是正確的問題時,我們不應該完全拋棄它們。

+0

確認assert [14] == asList(14)爲true。 +1 – 2010-01-04 17:01:50