今回は GDK が Collection インターフェースに追加するクラスのうち、型変換をするものを見ていきます。 今回でやっと Collection 最後かな。 ただ、まだ List をやらんといかんのだが。 型変換は便利だけどあんまり面白くないんでサラッといっちゃいましょう。
List asList() Collection asImmutable() Collection asSynchronized() Object asType(Class clazz) List toList() Set toSet()
as と to で似たのがありますが、as は自分自身を返すこともあるけど、to は既に指定された型のインスタンスであってもコピーを返す、という違いがあるようです。 これは Groovy 一般に言えるんかな?
メソッド | 返り値 | since | 説明 |
---|---|---|---|
asList() asImmutable() asSynchronized() |
List Collection Collection |
1.0 1.5.0 1.0 |
List に変換して返す。 既に List なら自分自身を返す 不変(変更できない)コレクションを返す 同期かされたコレクションを返す |
asType(Class) | Object | 1.0 | 指定された型に変換する |
toList() toSet() |
List Set |
1.0 1.8.0 |
List に変換して返す。 List に対して呼び出すとコピーを返す Set に変換して返す。 Set に対して呼び出すとコピーを返す |
ではそれぞれのメソッドのサンプルコードを。
asXxxx() メソッド
まずは as で始まるメソッド。 asList() は呼び出し元のコレクションを List オブジェクトに変換しますが、後で見る toList() と違って、既に呼び出し元が List なら自分自身を返します。 Groovy 一般について as は自分自身を返すのかな?と思いきや、asImmutable() とかはそうでもないみたいw asImmutable(), asSynchronized() は java.util.Collections クラスの unmodifiableList(), unmodifiableSet() を呼び出した場合と同じようです(unmodifiableCollectin() と言った方がいいのか)。
def langs = ['Java', 'Groovy', 'Scala', 'Clojure'] def langSet = langs as Set // asList() assert langs.asList() instanceof ArrayList assert langs.asList() == langs assert langs.asList().is(langs) // 元のオブジェクト // asImmutable() assert langs.asImmutable().class.name == 'java.util.Collections$UnmodifiableRandomAccessList' assert langs.asImmutable() == Collections.unmodifiableList(langs) // List に対して assert langSet.asImmutable() == Collections.unmodifiableSet(langSet) // Set に対して // asSynchronized() assert langs.asSynchronized().class.name == 'java.util.Collections$SynchronizedRandomAccessList' assert langs.asSynchronized() == Collections.synchronizedList(langs) // List に対して assert langSet.asSynchronized() == Collections.synchronizedSet(langSet) // Set に対して
asType() メソッド
asType() メソッドは as キーワードを使って型変換するときに呼び出されます。 as で始まるので変換の必要がなければ自分自身が返されます。 知らないクラスが指定された場合は Collection をとるコンストラクタによってインスタンス生成される模様。
toXxxx() メソッド
最後は to で始まるメソッド。 toList(), toSet() メソッド。 toList() は asList() と異なり、呼び出し元が List オブジェクトでもそのコピーが返されます。
// toList() assert langs.toList() instanceof ArrayList assert langs.toList() == langs assert !langs.toList().is(langs) // 元と別のオブジェクト // toSet() assert langs.toSet() instanceof HashSet assert langs.toSet() == langSet assert !langs.toSet().is(langSet) // 元と別のオブジェクト
さぁ、これで Collection に追加されたは終了。 でも、まだ List に追加されたメソッドが結構・・・
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (152件) を見る