可能不是最好的標題,但我會解釋:
我有一個對象數組 - 我們可以稱它們爲Person
。
每個Person
有一個Name
。我想分別創建一個Name
的數組。在現有數組中創建項目屬性數組
目前我有:
def peopleNames = new ArrayList<String>()
for (person in people)
{
peopleNames.add(person.name)
}
常規是否提供這樣做的更好的方法?
可能不是最好的標題,但我會解釋:
我有一個對象數組 - 我們可以稱它們爲Person
。
每個Person
有一個Name
。我想分別創建一個Name
的數組。在現有數組中創建項目屬性數組
目前我有:
def peopleNames = new ArrayList<String>()
for (person in people)
{
peopleNames.add(person.name)
}
常規是否提供這樣做的更好的方法?
Groovy提供a collect method Groovy的集合,使得它可以做到這一條線:
def peopleNames = people.collect { it.name }
這樣做的最簡潔的方式是使用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程序員。
你爲什麼不試試這個?我喜歡這個,因爲它是這麼理解的
def people = getPeople() //Method where you get all the people
def names = []
people.each{ person ->
names << person.name
}
我看不出這比使用「collect」更好。使用這種方法,你需要有一個單獨的行來創建'names'列表,然後從循環內部操作列表。 'collect'將所有這些集中在一個塊內。 – 2011-06-14 14:24:07
完全不可讀的'java'開發者從來沒有注意過'groovy'代碼(包括我自己)。 這個樣本是否使用「燈具」? (我聽說這個詞,但不知道它是什麼) – RonK 2011-06-14 14:27:28
@Ron不,它使用[左移運算符](http://groovy.codehaus.org/groovy-jdk/java/util/Collection。 html#leftShift%28T%29) – 2011-06-14 14:48:57
這兩種方法都不錯 - 我選擇了這個,因爲它是一個比較明顯的,大多數人保持這個代碼不精通'groovy',因爲它是「只是一個測試工具「 – RonK 2011-06-14 13:06:56