39 votes

Comment vérifier dans Groovy que cet objet est une liste, une collection ou un tableau ?

La question est aussi simple que le titre. Comment vérifier dans Groovy que cet objet est une liste, une collection ou un tableau ? Mais vous ne trouvez pas un moyen simple de le vérifier.

44voto

Burt Beckwith Points 46122

Un List est un Collection, donc les contrôles ne sont pas mutuellement exclusifs :

def foo = ...
boolean isCollection = foo instanceof Collection
boolean isList = foo instanceof List
boolean isSet = foo instanceof Set
boolean isArray = foo != null && foo.getClass().isArray()

41voto

Dónal Points 61837

Je ne sais pas si vous devez faire la distinction entre Collection, List et Array, ou si vous voulez simplement savoir si un objet est l'un de ces types. Si ce dernier, vous pourriez utiliser ceci :

boolean isCollectionOrArray(object) {    
    [Collection, Object[]].any { it.isAssignableFrom(object.getClass()) }
}

// some tests
assert isCollectionOrArray([])
assert isCollectionOrArray([] as Set)
assert isCollectionOrArray([].toArray())
assert !isCollectionOrArray("str")

Exécutez le code ci-dessus dans la console Groovy pour confirmer qu'il se comporte comme annoncé

7voto

pgiecek Points 4962

Si vous cherchez un moyen Groovy, regardez à l'opérateur in. Il s'agit en fait d'une combinaison de Class.isAssignableFrom(Class<?>) et Class.isInstance(Object), ce qui signifie que vous pouvez l'utiliser pour tester des classes ainsi que des objets.

// Test classes
assert ArrayList in Collection
assert ArrayList in List
assert HashSet in Collection
assert HashSet in Set

// Test objects
def list = [] as ArrayList
def set = [] as HashSet

assert list in Collection
assert list in List
assert set in Collection
assert set in Set

Tester si un objet est un tableau peut s'avérer délicat. Je recommanderais l'approche de @ BurtBeckwith.

def array = [].toArray()

assert array.getClass().isArray()

3voto

plajko Points 101

Je l'utilise pour "arrayfy" un objet, si c'est déjà une collection alors il retournera une copie, sinon l'envelopper dans une liste. Donc, vous n'avez pas besoin de le vérifier pendant le traitement, ce sera toujours une collecte.

def arrayfy = {[] + it ?: [it]}
def list = arrayfy(object) // will be always a list

0voto

Simone Points 1504

Il suffit d'utiliser l'instance de l'opérateur et de vérifier si l'objet est une instance de java.util.Collection

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X