如何在Groovy中检查该对象是列表或集合或数组?

And*_*ich 32 collections groovy

问题就像标题一样简单.如何在Groovy中检查该对象是列表或集合或数组?但找不到一种简单的检查方法.有任何想法吗?

Bur*_*ith 36

A List是a 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()
Run Code Online (Sandbox Code Playgroud)

  • +1不重新发明轮子.恕我直言,Java语法在这种情况下非常简洁,并且比建议的groovy-way解决方案更具可读性. (4认同)

Dón*_*nal 30

我不知道你是否需要区分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")
Run Code Online (Sandbox Code Playgroud)

在Groovy控制台中运行上面的代码,以确认它的行为与广告一样


pgi*_*cek 7

如果您正在寻找 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
Run Code Online (Sandbox Code Playgroud)

测试对象是否是数组可能很棘手。我会推荐@BurtBeckwith 的方法。

def array = [].toArray()

assert array.getClass().isArray()
Run Code Online (Sandbox Code Playgroud)