Java で要素がひとつだけのコレクションをつくる

2007/10/07 11:11am

Java でときどき、要素がひとつだけのコレクションがほしくなるときがある。たとえば、利用しているライブラリのメソッドが引数としてコレクションを要求しているが、渡したいオブジェクトがひとつしかないとか。

こういう場合、コレクションの型が List だとすると、まず思いつくのは、新しく生成した ArrayList に要素をひとつだけ追加する方法だ。

List<String> list = new ArrayList<String>();
list.add("element");
doSomething(list);

だが、この方法は変換に一時変数が必要になり不格好だ。

Arrays.asList を使う方法

この変換は Arrays.asList を使うことで簡単にできる。

doSomething(Arrays.asList(new String[]{"element"}));

要素がひとつだけの配列をリストに変換する、と捉え直すわけだ。そして、Java 1.5 から Arrays.asList は配列ではなく可変長引数をとるようになったので、更に簡単に書ける。

doSomething(Arrays.asList("element"));

Collectios.singleton 系メソッド

Arrays.asList ではリスト以外のコレクションには変換できない上、要素がひとつだけのコレクションのために配列を用意しているため、まだまだメモリ的に非効率だ。

実は java.util.Collections にはこうした用途に使えるメソッドがすでに用意されている。

上記のメソッドはそれぞれ、渡されたオブジェクトを要素がひとつだけのコレクションに変換するメソッドだ。

Set<String> set = Collections.singleton("element");
List<String> list = Collections.singletonList("element");
Map<String, String> map = Collections.singletonMap("key", "value")

また、変換後のコレクションには、要素をインスタンス変数として直接もつ独自のコレクション・クラスを利用しているため、メモリ効率も一番良い。