Вопрос такой же простой, как и заголовок. Как проверить Groovy, что этот объект является списком или коллекцией или массивом? Но не может найти простой способ проверить его. Любые идеи?
Как проверить Groovy, что этот объект является списком или коллекцией или массивом?
Ответ 1
Я не знаю, нужно ли различать Collection, List и Array или просто хотите знать, является ли объект любым из этих типов. Если последнее, вы можете использовать это:
boolean isCollectionOrArray(object) {
[Collection, Object[]].any { it.isAssignableFrom(object.getClass()) }
}
// some tests
assert isCollectionOrArray([])
assert isCollectionOrArray([] as Set)
assert isCollectionOrArray([].toArray())
assert !isCollectionOrArray("str")
Запустите код выше в консоли Groovy, чтобы подтвердить, что он ведет себя как рекламируемый
Ответ 2
A List
является Collection
, поэтому проверки не являются взаимоисключающими:
def foo = ...
boolean isCollection = foo instanceof Collection
boolean isList = foo instanceof List
boolean isSet = foo instanceof Set
boolean isArray = foo != null && foo.getClass().isArray()
Ответ 3
Если вы ищете способ Groovy, посмотрите на оператор in
. На самом деле это комбинация Class.isAssignableFrom(Class<?>)
и Class.isInstance(Object)
, что означает, что вы можете использовать ее для тестирования классов, а также объектов.
// 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
Тестирование, если объект является массивом, может быть сложным. Я бы рекомендовал подход @BurtBeckwith.
def array = [].toArray()
assert array.getClass().isArray()
Ответ 4
Просто используйте оператор instanceof и проверьте, является ли объект экземпляром java.util.Collection
Ответ 5
Обычно вам нужно проверить его поведение с утиным набором.
def foo = someMethod()
if (foo.metaClass.respondsTo('each')) {
foo.each {println it}
}