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.
Réponses
Trop de publicités?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é
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()
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