広告

Java : List から配列への変換

本記事では、List から配列へ変換する方法を3つご紹介します。
Java 11 以降であれば、Collection.toArray(IntFunction) を使うのがおすすめです。


概要

Java では、同じ型の複数の要素(値) を管理する方法として、List配列 があります。

// リスト
final var list = List.of("aaa", "bbb", "ccc");

// 配列
final String[] array = {"xxx", "yyy", "zzz"};

この List と配列ですが、

  • List → 配列
  • 配列 → List

と相互に変換したくなることが、たまにあったります。
本記事では、List から配列への変換にしぼって、3つの方法をご紹介します。

配列から List への変換については、下記の関連記事をご参照ください。

関連記事

List から配列への変換

Collection.toArray(IntFunction)

<T> T[] toArray(IntFunction<T[]> generator)
指定されたgenerator関数を使用してこのコレクションのすべての要素を含む配列を返し、返された配列を割り当てます。

Java 11 以降であれば、Collection.toArray(IntFunction) メソッドが使えます。
ちなみに List は Collection を実装しています。

文字列のリストである List<String> を 配列 (String[]) へ変換する例を見てみましょう。

// 文字列のリスト
final List<String> list = List.of("aaa", "bbb", "ccc");
System.out.println(list); // [aaa, bbb, ccc]

// 配列へ変換
final String[] array = list.toArray(String[]::new);
System.out.println(Arrays.toString(array)); // [aaa, bbb, ccc]

無事に、Collection.toArray(IntFunction) で配列へと変換できました。

もしかしたら、

  • String[]::new

という書き方を、見慣れないかたもいらしゃるかもしれません。

final String[] array = list.toArray(String[]::new);
                                    ^^^^^^^^^^^^^ <--- コンストラクタ参照

これは コンストラクタ参照 という書き方です。
メソッド参照の1つで、Java 8 から使えるようになりました。

詳しくは、下記の記事をご参照ください。


変換元の List と、変換した結果の配列は連動しません

配列の要素を変更しても、List には反映されません。
また、List の要素を変更しても配列には反映されません。

final List<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc");

final String[] array = list.toArray(String[]::new);

System.out.println(list); // [aaa, bbb, ccc]
System.out.println(Arrays.toString(array)); // [aaa, bbb, ccc]

list.set(1, "XXX");
array[2] = "YYY";

System.out.println(list); // [aaa, XXX, ccc]
System.out.println(Arrays.toString(array)); // [aaa, bbb, YYY]

List.toArray(T[]) メソッド

<T> T[] toArray(T[] a)
このリスト内のすべての要素を適切な順序で(最初の要素から最後の要素へ)含んでいる配列を返します。

Java 11 より前のバージョンであれば、List.toArray(T[]) が使えます。
toArray(T[]) メソッドのパラメータには配列を指定します。

1つ注意する点としては、指定した配列のサイズが…

  • List より小さい : 新しく new された配列を返す
  • List 以上 : 指定した配列に List の内容がコピーされる

と挙動が変わります。

もし、必ず new された新しい配列を返してもらいたいときは、サイズ 0 の配列を指定します。

// 文字列のリスト
final List<String> list = List.of("aaa", "bbb", "ccc");
System.out.println(list); // [aaa, bbb, ccc]

// 配列へ変換
final String[] array = list.toArray(new String[0]);
System.out.println(Arrays.toString(array)); // [aaa, bbb, ccc]

既存の配列に List の内容をコピーしたいときは、次のようにします。

final List<String> list = List.of("aaa", "bbb", "ccc");
System.out.println(list); // [aaa, bbb, ccc]

final String[] array = new String[list.size()];
System.out.println(Arrays.toString(array)); // [null, null, null]

list.toArray(array);
System.out.println(Arrays.toString(array)); // [aaa, bbb, ccc]

プリミティブ型への変換

プリミティブ型の配列に変換するには ストリーム を使うと1行で書けます。

例えば List<Integer> を int[] に変換するには、次のようにします。

final List<Integer> list = List.of(10, 20, 30);
System.out.println(list); // [10, 20, 30]

final int[] array = list.stream().mapToInt(Integer::intValue).toArray();
System.out.println(Arrays.toString(array)); // [10, 20, 30]

まとめ

本記事では、List から配列への変換方法を3つご紹介しました。
Java 11 以降であれば、Collection.toArray(IntFunction) を使うのがおすすめです。


関連記事

ページの先頭へ