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. ModelMapperで1対1に対応しないフィールドのマッピング
  2. Javaサーブレットにおける部分URLやファイルパスの取得
  3. JJUG CCC 2019 Springに参加してきました
  4. MavenでOSSのライセンス一覧を出力する
  5. Spring Web MVCのAuto Configuration周辺のクラス図を描いてみた
  6. Spring Data JPAのgetOne()で遅延ロードエラー
  7. Spring Boot アノテーション集

tosi avatar
tosi
Web Application Engineer, Java / Spring / Azure / GCP
comments powered by Disqus