问题就像标题所说的一样简单。在Groovy中如何检查对象是否为列表、集合或数组?但是我找不到一个简单的方法来检查它。有任何想法吗?
问题就像标题所说的一样简单。在Groovy中如何检查对象是否为列表、集合或数组?但是我找不到一个简单的方法来检查它。您有什么想法吗?
问题就像标题所说的一样简单。在Groovy中如何检查对象是否为列表、集合或数组?但是我找不到一个简单的方法来检查它。您有什么想法吗?
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()
我不知道你是否需要区分集合(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控制台中运行上面的代码以确认其按照宣传的方式运行
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()
def arrayfy = {[] + it ?: [it]}
def list = arrayfy(object) // will be always a list
object
只是一个变量名,可以是任何名称。 - plajkodef foo = someMethod()
if (foo.metaClass.respondsTo('each')) {
foo.each {println it}
}
Object
中添加了each
方法,因此每个对象都可以响应each
。因此,这个提案是有问题的。 - DónalObject
会响应 each
。无论如何,你都需要检查你实际要使用的方法,所以如果你使用了不同的方法,这可能还可以正常工作。如果你计划使用 each
,那么不幸的是这将不足够。 - Adam Stegmaninstanceof
更有益处的地方。 - Dónal
def map = [me: 'you', him: 'her'] // def map = 'just a string' if (map instanceof HashMap) { println 'hash' } else { println 'not hash' }
- Max Cascone