2015-12-31 30 views
14

Ho due metodi: one e two. Il metodo one prende uno List<Person> dove person è una classe e il metodo two accetta singoli oggetti della classe Person.Passa l'elenco degli oggetti come parametri individuali

Come passare lo List<Person> come parametri oggetto individuale al metodo two? Il List potrebbe contenere 0 o 1 o più elementi e voglio passare null se l'elenco non ha tutti i 3 parametri richiesti dal metodo two.

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

mi piacerebbe evitare di usare i nomi dei parametri capitalizzati esempio 'persone 'invece di' Persone'. Le capitali possono a volte farti soffrire, dato che Groovy può occasionalmente indovinare che stai parlando di una classe –

+0

Errore di refactoring durante la modifica del mio nome di classe corretto con un esempio. Non lo faccio nella mia programmazione giornaliera. Ho modificato la domanda –

risposta

8

È possibile utilizzare la diffusione operatore * per il tuo metodo di chiamata, ma in base al commento "L'elenco potrebbe contenere 0 o 1 o più elementi" si vuole utilizzare la funzione variadica per il tuo secondo metodo. Prova questo:

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

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

Ora è possibile chiamare il passare nulla due metodo, un elenco vuoto, o un qualsiasi numero di istanze di persona come il:

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

Usa:

two(*persons) 

* si divideranno la lista e superare i suoi elementi come argomenti separati.

Sarà:

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

Bello! È quasi giusto, ma cosa succede se ci sono solo due argomenti? uno (['a', 'b']). biniam vuole avere null come mancante. Fortunatamente, ci sono argomenti predefiniti in Groovy, quindi la soluzione completa sarebbe due (String firstPerson = null, String secondPerson = null, String thirdPerson = null) –

+0

@JakubDyszkiewicz, sentiti libero di modificare la risposta. – Opal

Problemi correlati