Java で要素がひとつだけのコレクションをつくる
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")
また、変換後のコレクションには、要素をインスタンス変数として直接もつ独自のコレクション・クラスを利用しているため、メモリ効率も一番良い。