質問はタイトルと同じくらい簡単です。 Groovyでオブジェクトがリスト、コレクション、または配列であることを確認するにはどうすればよいですか?しかし、それをチェックする簡単な方法を見つけることができません。何か案は?
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コンソールで上記のコードを実行し、アドバタイズされたとおりに動作することを確認します
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()
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
Instanceof演算子を使用して、オブジェクトがJava.util.Collectionのインスタンスであるかどうかを確認するだけです
通常、その動作を ダックタイピング で確認します。
def foo = someMethod()
if (foo.metaClass.respondsTo('each')) {
foo.each {println it}
}