2015-12-31 2 views
14

Ich habe zwei Methoden - one und two benannt. Methode one dauert eine List<Person> wo person ist eine Klasse und Methode two nimmt einzelne Objekte der Person Klasse. Wie kann ich die List<Person> als individuelle Objektparameter an Methode two übergeben? Die List könnte 0 oder 1 oder mehr Elemente enthalten und ich möchte null übergeben, wenn die Liste nicht alle 3 Parameter enthält, die von Methode two benötigt werden.Passliste der Objekte als individuelle Parameter

def one (List<Person> persons) { 

    // check the size of the list 
    // pass arguments to method two 

    // this works 
    two(persons[0], persons[1], persons[2]) 

    //what I want is 
    two(persons.each { it + ', '}) 
} 

def two (Person firstPerson, Person secondPerson, Person thirdPerson) { 

    // do something with the persons 
} 
+0

ich vermeiden würde aktivierten Parameternamen, dh 'Personen 'anstelle von' Personen'. Capitals können manchmal Kummer verursachen, da Groovy gelegentlich annehmen kann, dass du in einer Klasse bist. –

+0

Es war ein Refactoring-Fehler, wenn ich meinen korrekten Klassennamen mit einem Beispiel änderte. Ich mache das nicht in meiner täglichen Programmierung. Ich habe die Frage bearbeitet –

Antwort

8

Sie die Ausbreitung Operator * für Ihre Rufmethode verwenden können, aber basierend auf dem Kommentar „Die Liste könnte enthalten 0 oder 1 oder mehr Elemente“ Sie wollen, dass die verwenden Variadic-Funktion für Ihre zweite Methode. Versuchen Sie folgendes:

// Spread operator "*" 
def one(List<Person> persons) { 
    two(*persons) 
} 

// Variadic function "..." 
def two(Person... values) { 
    values.each { person -> 
    println person 
    } 
} 

Nun können Sie die beiden Methode übergeben null nennen, eine leere Liste, oder eine beliebige Anzahl von Instanzen Person wie:

two(null) 
two([]) 
two(person1, person2, person3, person4, person5) 
11

Verwendung:

two(*persons) 

* wird die Liste geteilt und seine Elemente als separate Argumente übergeben.

Es wird sein:

def one (List<String> strings) { 
    two(strings[0], strings[1], strings[2]) 
    two(*strings) 
} 

def two (String firstPerson = null, String secondPerson = null, String thirdPerson = null) { 
    println firstPerson 
    println secondPerson 
    println thirdPerson 
} 

one(['a','b','c']) 
+2

Nizza! Es ist fast richtig, aber was ist, wenn es nur zwei Argumente gibt? eins ([a ',' b ']). Biniam will null als fehlenden haben. Glücklicherweise gibt es in Groovy Standardargumente, so dass die vollständige Lösung zwei wäre (String firstPerson = null, String secondPerson = null, String thirdPerson = null) –

+0

@JakubDyszkiewicz, fühlen Sie sich frei, die Antwort zu bearbeiten. – Opal