Как проверить в Groovy, что объект является списком, коллекцией или массивом? - PullRequest
29 голосов
/ 01 сентября 2011

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

Ответы [ 6 ]

33 голосов
/ 01 сентября 2011

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()
28 голосов
/ 02 сентября 2011

Я не знаю, нужно ли вам различать 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, чтобы убедиться, что он ведет себя так, как объявлено

4 голосов
/ 04 апреля 2016

Если вы ищете 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()
2 голосов
/ 01 апреля 2019

Я использую это для "массива" объекта, если он уже является коллекцией, он вернет копию, иначе поместит его в список. Так что вам не нужно проверять его во время обработки, это всегда будет коллекция.

def arrayfy = {[] + it ?: [it]}
def list = arrayfy(object) // will be always a list
0 голосов
/ 01 сентября 2011

Обычно вы хотите проверить его поведение, набрав duck .

def foo = someMethod()
if (foo.metaClass.respondsTo('each')) {
  foo.each {println it}
}
0 голосов
/ 01 сентября 2011

Просто используйте оператор instanceof и проверьте, является ли объект экземпляром java.util.Collection

...