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

Collections 如何在Groovy中检查对象是列表、集合或数组?,collections,groovy,Collections,Groovy,这个问题和标题一样简单。如何在Groovy中检查对象是列表、集合或数组?但是找不到一个简单的方法来检查它。有什么想法吗?只需使用instanceof操作符,检查对象是否是java.util.Collection的实例一个列表是一个集合,因此检查并不相互排斥: def foo = ... boolean isCollection = foo instanceof Collection boolean isList = foo instanceof List boolean isSet = foo

这个问题和标题一样简单。如何在Groovy中检查对象是列表、集合或数组?但是找不到一个简单的方法来检查它。有什么想法吗?

只需使用instanceof操作符,检查对象是否是java.util.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()

通常情况下,您会希望使用来检查其行为


我不知道您是否需要区分集合、列表和数组,或者只是想知道对象是否属于这些类型。如果是后者,您可以使用:

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控制台中运行上面的代码,确认它的行为与广告的一样

如果您正在寻找Groovy方式,请查看操作符中的
。它实际上是
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

这与我在Java中的实现方法相同:)。所以,没有Groovy方式?“boolean isArray=foo instanceof Object[]”也应该起作用。如果foo为null,它将返回false,并且不会抛出异常。+1表示没有重新发明轮子。在本例中,Java语法非常简洁,并且比建议的groovy way解决方案可读性更好。。。但我觉得奇怪的是Groovy没有提供一种简单的方法来运行这样的测试(当然,除非它现在2018-02-14提供了这样的方法…)FWIW这也可以完美地与哈希一起工作:交换两个map def,然后看到:``defmap=[me:'you',him:'her']//defmap='只是一个字符串'if(map instanceof HashMap){println'hash'}else{println'not hash'}``Burt回答说,没有groovy方法..但我也会尝试object[]的object instanceof…但绝对不确定它对每个对象的响应,我认为Groovy将
each
方法添加到
Object
中,因此每个对象都响应
each
。因此,这个建议是错误的。哎呀,我没有意识到
对象
每个
都做出了响应。不管怎样,你都要检查你正在执行的方法如果你打算使用
每一个
,那么不幸的是,这是不够的。为什么不直接使用对象的类来确定它的类型,而不是检查特定方法的存在呢?我不认为使用这种方法比
更有效f
?duck类型的好处是,您不需要硬编码特定的实现。如果调用者喜欢不同的实现(例如,他们自己的实现),调用者可以使用您的文档来决定传递什么。我得到了一个错误,除非我在object
object
中将“O”大写。这里只是一个变量的名称,可以是任何内容。
def arrayfy = {[] + it ?: [it]}
def list = arrayfy(object) // will be always a list