2016-05-13 7 views
2

Ich möchte eine Funktion, die varargs als Liste zurück, so dassWie konvertiere ich Varargs in eine einzelne Liste, auch wenn der Parameter bereits eine Liste ist?

ensure_list(1, 2, 3) 

kehrt

[1,2,3] 

Aber der Nachteil ist, dass ich

wollen
ensure_list([1, 2, 3]) 

den gleichen Wert zurück.

versuchte ich

def ensure_list(Object... args) { 
    if (args instanceof List<Object>) { 
    return args 
    } else { 
    return Arrays.asList(args) 
    } 
} 

aber ich bekomme

[[1,2,3]] 

Die Eingabe in einer Liste durch die Zeit args wird umschlossen ist. Gibt es einen Weg um dies oder ein anderes Muster, das bewirkt, was ich will?

Antwort

1

args ist immer ein Array, Ihr Test für wenn args eine Liste ist immer falsch sein:

def foo(Object ... args) { 
    args.class.array // returns true 
} 

Stattdessen prüfen, ob das erste Element des args eine Liste ist:

def ensure_list(Object ... args) { 
    if (args.length == 1 && args[0] instanceof List) { 
     return args[0] 
    } 
    Arrays.asList(args) 
} 


groovy:000> ensure_list(1,2,3) 
===> [1, 2, 3] 
groovy:000> ensure_list([1,2,3]) 
===> [1, 2, 3] 
2

Betrachten flatten(), die eine Mischung von Listen und Argumenten erleichtern würde (wenn das tatsächlich gewünscht ist):

def ensure_list(Object... args) { 
    args.flatten() 
} 

assert [1,2,3] == ensure_list(1, 2, 3) 
assert [1,2,3] == ensure_list([1, 2, 3]) 
assert [1,2,3] == ensure_list([1, 2] , 3) 
Verwandte Themen