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;
}
出力をオブジェクト配列にする場合とプリミティブ型配列にする場合で、書き方が異なる。
出力をオブジェクト配列にする場合は、きれいに書けた。
しかし出力をプリミティブ型配列にする場合は、インデックスでアクセスする形でしか実装できなかった。
もっと良い書き方を見つけたら追記したい。