[Java] リスト(List<T>) から 配列(T[]) へ変換する方法

Java

私は Java で 配列を扱うプログラムが好きではありません。
配列を扱うプログラムを見て List や Collection にしてくれれば楽なのにな、と思うことが多々あります。

しかし、どうしても配列を使わなければならない場合があります。
配列の要素がプリミティブ型の時だったり、
メソッドの引数が可変長引数の時だったり、
使っているライブラリの仕様だったり、
Java 初学者(むしろ学んでない人)が作ったメソッドだったり。

とにかく配列に変換しないことには処理できないので渋々変換するわけですが、今回はその変換方法をご紹介します。

前提

総称型の配列は作れない。

T[]new をしようとするとコンパイルエラーになります。

引数なしの toArray() メソッドは Object の配列を返す。

list.toArray()Object[] を返します。
Object[] では扱えないケースが多いので、今回は NG とします。

String のリストを String の配列にする方法

final List<String> list = new ArrayList<>();
list.add("abc");
list.add("...");
list.add("xyz");
String[] strings = list.toArray(new String[list.size()]);

配列の型をガッチリ指定する必要があるので、あまりイケてませんね。

前述とほぼ同じですが、Stream を使用して変換することもできます。

final List<String> list = new ArrayList<>();
list.add("abc");
list.add("...");
list.add("xyz");
String[] strings = list.stream().toArray(len -> new String[len]);

これはリストを色々と処理した結果を配列にする場合に使います。

コレクション取扱いユーティリティクラス

リストから配列への変換を頻繁に行う場合は、ユーティリティクラス(例えば以下のようなクラス)を作成すると良いでしょう。

  /**
   * {@code String} 配列への変換処理.
   *
   * @param collection 配列に変換するコレクション
   * @return コレクションから変換した配列
   */
  public static final String[] toStringArray(Collection<String> collection) {
    return collection.toArray(new String[collection.size()]);
  }

  /**
   * {@code Long} 配列への変換処理.
   *
   * @param collection 配列に変換するコレクション
   * @return コレクションから変換した配列
   */
  public static final Long[] toLongArray(Collection<Long> collection) {
    return collection.toArray(new Long[collection.size()]);
  }

  /**
   * {@code Integer} 配列への変換処理.
   *
   * @param collection 配列に変換するコレクション
   * @return コレクションから変換した配列
   */
  public static final Integer[] toIntegerArray(Collection<Integer> collection) {
    return collection.toArray(new Integer[collection.size()]);
  }

  /**
   * {@code Short} 配列への変換処理.
   *
   * @param collection 配列に変換するコレクション
   * @return コレクションから変換した配列
   */
  public static final Short[] toShortArray(Collection<Short> collection) {
    return collection.toArray(new Short[collection.size()]);
  }

  /**
   * {@code Double} 配列への変換処理.
   *
   * @param collection 配列に変換するコレクション
   * @return コレクションから変換した配列
   */
  public static final Double[] toDoubleArray(Collection<Double> collection) {
    return collection.toArray(new Double[collection.size()]);
  }

  /**
   * {@code Float} 配列への変換処理.
   *
   * @param collection 配列に変換するコレクション
   * @return コレクションから変換した配列
   */
  public static final Float[] toFloatArray(Collection<Float> collection) {
    return collection.toArray(new Float[collection.size()]);
  }

  /**
   * 配列への変換処理.
   *
   * @param collection 配列に変換するコレクション
   * @return コレクションから変換した配列
   */
  public static final Object[] toObjectArray(Collection<?> collection) {
    return collection.toArray();
  }

お役に立てたのなら嬉しいです。

コメント