Как проверить 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}
}