2010-01-04 3 views
3

J'ai un problème avec groovy essayant de comprendre comment convertir un seul élément en liste. J'ai une variable entrante params.contacts, qui pourrait être une valeur unique (par exemple 14) ou il pourrait s'agir d'un tableau de valeurs (par exemple 14, 15). Je veux toujours le transformer en liste. Auparavant, je disais simplement params.contacts.toList(), mais ce code échoue lorsqu'il s'agit d'un seul élément. Cela prendrait une valeur de 14 et le diviserait en une liste de [1, 4].Groovy List Conversion

Existe-t-il un moyen simple et élégant de gérer ce problème?

Répondre

8

Un moyen facile, le mettre dans une liste et l'aplatir:

def asList(orig) { 
    return [orig].flatten() 
} 

assert [1, 2, 3, 4] == asList([1, 2, 3, 4]) 
assert ["foo"] == asList("foo") 
assert [1] == asList(1) 

Un problème est que ça va complètement aplatissent les choses, il est donc pas une bonne approche car elle va dans les listes aplatissent votre liste:

assert [[1, 2], [3, 4]] == asList([[1, 2], [3, 4]]) // fails! 

Une autre façon serait d'utiliser le système de type à votre avantage:

def asList(Collection orig) { 
    return orig 
} 

def asList(orig) { 
    return [orig] 
} 

assert [1, 2, 3, 4] == asList([1, 2, 3, 4]) 
assert ["foo"] == asList("foo") 
assert [1] == asList(1) 
assert [[1, 2], [3, 4]] == asList([[1, 2], [3, 4]]) // works! 

ici , nous laissons le système de type faire tout le travail lourd pour nous. Si nous avons déjà une collection, il suffit de la renvoyer. Sinon, transformez-le en liste. Des trucs comme celui-ci de Java sont encore disponibles dans groovy, et nous ne devrions pas les jeter complètement quand ils sont la bonne chose pour le problème.

+0

Confirmé que assert [14] == asList (14) est vrai. +1 –