Подтвердить что ты не робот

Как проверить Groovy, что этот объект является списком или коллекцией или массивом?

Вопрос такой же простой, как и заголовок. Как проверить Groovy, что этот объект является списком или коллекцией или массивом? Но не может найти простой способ проверить его. Любые идеи?

4b9b3361

Ответ 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}
}