Javaでオブジェクト配列からフィールド配列を生成

Javaで、オブジェクト配列から特定のフィールドを取り出した配列を生成したくなったときのメモ。
具体的には、以下のような場面。

  • MyBatisでDBからオブジェクトの配列として読み出したあと、フィールドの配列が必要になった
  • MyBatisはフィールドだけ配列として読み出しも可能だけど、SQLは1回に抑えたい

ちなみにPHPでは同等の機能を持つものとして、array_column()という関数があるらしい。

いろいろ調べた結果、Streamとラムダ式を使って実装するのが最もわかりやすくてシンプル。
Java8が出てもう結構経つのに、使いこなせていなくて反省…。

public String[] nameArray(Data[] data) {
  return Stream.of(data).map(x -> x.month).toArray(String[]::new);
}

public int[] idArray(Data[] data) {
  return IntStream.range(0, data.length).map(i -> mapper.map(data[i])).toArray();
}

public double[] scoreArray(Data[] data) {
  return IntStream.range(0, data.length).mapToDouble(i -> mapper.map(data[i])).toArray();
}

public Data {
  int id;
  double score;
  String name;
}

出力をオブジェクト配列にする場合とプリミティブ型配列にする場合で、書き方が異なる。
出力をオブジェクト配列にする場合は、きれいに書けた。
しかし出力をプリミティブ型配列にする場合は、インデックスでアクセスする形でしか実装できなかった。

もっと良い書き方を見つけたら追記したい。

関連記事


  1. アノテーションを活用した影響調査にトライしてみた
  2. Groovyの == 演算子と equals() は厳密に同じではない
  3. ModelMapperで1対1に対応しないフィールドのマッピング
  4. Javaサーブレットにおける部分URLやファイルパスの取得
  5. DDLを自動生成してJavaと各DBのデータ型を比較してみた
  6. 既存コードへのCheckstyle導入におけるルールの選定
  7. Checkstyleで汎用的に使えそうなルールをピックアップしてみた

comments powered by Disqus