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)
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[]) メソッド
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) を使うのがおすすめです。
関連記事
- List(リスト)の基本
- Map(マップ)の基本
- Set(セット)の基本
- List の初期化方法いろいろ
- Map の初期化方法いろいろ
- Set の初期化方法いろいろ
- 配列 vs. List
- 配列からListへの変換
- API 使用例
- Collection (コレクション)
- Collections (コレクション操作)
- Comparable
- Comparator
- Iterator
- List (リスト)
- Map (マップ)
- Map.Entry (キーと値のペア)
- Queue (キュー)
- AbstractQueue
- ArrayBlockingQueue (ブロッキング・配列キュー)
- ArrayDeque (両端キュー)
- BlockingDeque (ブロッキング・両端キュー)
- BlockingQueue (ブロッキング・キュー)
- ConcurrentLinkedDeque (並列処理用・両端キュー)
- ConcurrentLinkedQueue (並列処理用キュー)
- Deque (両端キュー)
- LinkedBlockingDeque (ブロッキング・リンク両端キュー)
- LinkedBlockingQueue (ブロッキング・リンクキュー)
- LinkedList (二重リンク・リスト)
- PriorityBlockingQueue (ブロッキング・優先度付きキュー)
- PriorityQueue (優先度付きキュー)
- RandomAccess
- Set (セット)
- Spliterator