web-dev-qa-db-ja.com

Groovyでオブジェクトがリスト、コレクション、または配列であることを確認するにはどうすればよいですか?

質問はタイトルと同じくらい簡単です。 Groovyでオブジェクトがリスト、コレクション、または配列であることを確認するにはどうすればよいですか?しかし、それをチェックする簡単な方法を見つけることができません。何か案は?

29

Collection、List、Arrayを区別する必要があるかどうか、またはオブジェクトがこれらのタイプのanyであるかどうかだけを知りたいかどうかはわかりません。後者の場合、これを使用できます。

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コンソールで上記のコードを実行し、アドバタイズされたとおりに動作することを確認します

28
Dónal

ListCollectionであるため、チェックは相互に排他的ではありません。

def foo = ...
boolean isCollection = foo instanceof Collection
boolean isList = foo instanceof List
boolean isSet = foo instanceof Set
boolean isArray = foo != null && foo.getClass().isArray()
35
Burt Beckwith

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
pgiecek

これを使用してオブジェクトを「配列化」します。既にコレクションになっている場合はコピーを返し、そうでない場合はリストにラップします。したがって、処理中にチェックする必要はなく、常にコレクションになります。

def arrayfy = {[] + it ?: [it]}
def list = arrayfy(object) // will be always a list
2
plajko

Instanceof演算子を使用して、オブジェクトがJava.util.Collectionのインスタンスであるかどうかを確認するだけです

0
Simone

通常、その動作を ダックタイピング で確認します。

def foo = someMethod()
if (foo.metaClass.respondsTo('each')) {
  foo.each {println it}
}
0
Adam Stegman