web-dev-qa-db-fra.com

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 je ne trouve pas un moyen simple de le vérifier. Des idées?

27
Andrey Adamovich

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 any de ces types. Si ce dernier, vous pouvez 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é

27
Dónal

Une List est une Collection, les chèques ne s'excluent donc pas mutuellement:

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

Si vous recherchez une méthode 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 être délicat. Je recommanderais l'approche de @ BurtBeckwith.

def array = [].toArray()

assert array.getClass().isArray()
4
pgiecek

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

0
Simone

Habituellement, vous voudriez vérifier son comportement avec duck taping .

def foo = someMethod()
if (foo.metaClass.respondsTo('each')) {
  foo.each {println it}
}
0
Adam Stegman