2011-06-14 36 views
1

可能不是最好的標題,但我會解釋:
我有一個對象數組 - 我們可以稱它們爲Person
每個Person有一個Name。我想分別創建一個Name的數組。在現有數組中創建項目屬性數組

目前我有:

def peopleNames = new ArrayList<String>() 

for (person in people) 
{ 
    peopleNames.add(person.name) 
} 

常規是否提供這樣做的更好的方法?

回答

7

Groovy提供a collect method Groovy的集合,使得它可以做到這一條線:

def peopleNames = people.collect { it.name } 
+0

這兩種方法都不錯 - 我選擇了這個,因爲它是一個比較明顯的,大多數人保持這個代碼不精通'groovy',因爲它是「只是一個測試工具「 – RonK 2011-06-14 13:06:56

3

還是spread operator

def peopleNames = people*.name 
+0

我總是忘記那個......很酷! – ig0774 2011-06-14 12:57:28

2

這樣做的最簡潔的方式是使用GPath表達式

// Create a class and use it to setup some test data 
class Person { 

    String name 
    Integer age 
} 

def people = [new Person(name: 'bob'), new Person(name: 'bill')] 

// This is where we get the array of names 
def peopleNames = people.name 

// Check that it worked 
assert ['bob', 'bill'] == peopleNames 

這是一個完整的字符shorte r比spread operator suggestion。然而,國際海事組織的sperad運營商和collect{}解決方案更具可讀性,特別是對於Java程序員。

1

你爲什麼不試試這個?我喜歡這個,因爲它是這麼理解的

def people = getPeople() //Method where you get all the people 
def names = [] 
people.each{ person -> 
    names << person.name 
} 
+1

我看不出這比使用「collect」更好。使用這種方法,你需要有一個單獨的行來創建'names'列表,然後從循環內部操作列表。 'collect'將所有這些集中在一個塊內。 – 2011-06-14 14:24:07

+0

完全不可讀的'java'開發者從來沒有注意過'groovy'代碼(包括我自己)。 這個樣本是否使用「燈具」? (我聽說這個詞,但不知道它是什麼) – RonK 2011-06-14 14:27:28

+0

@Ron不,它使用[左移運算符](http://groovy.codehaus.org/groovy-jdk/java/util/Collection。 html#leftShift%28T%29) – 2011-06-14 14:48:57

相關問題