データベースから取得したデータは、独自クラスか java.util.Map のリストの形になっている場合が多い。User というクラスを定義しておき、データベースから取得したデータを User クラスのフィールドの値としてセットする場合を例に考えてみる。
public class User implements Serializable { private long userId; private String firstName; private String lastName; ... }
List<User> users = dao.list();
取得したデータは、java.util.List に複数の User を格納した形になるが、userId をキーにした java.util.Map に変換することが多い。java.util.Map インタフェースを実装したクラスのインスタンスを生成して、java.util.List をループで回してセットしてもよいのだが、同じようなコードを何度も書くのは面倒なので、Generics と java.beans.PropertyDescriptor を使ったユーティリティを作成してみた。
public static <K, V> Map<K, V> toMap(Collection<V> c, String field) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Map<K, V> m = new LinkedHashMap<K, V>(); for (V v : c) { PropertyDescriptor pd = new PropertyDescriptor(field, v.getClass()); K k = (K) pd.getReadMethod().invoke(v, (Object[]) null); m.put(k, v); } return m; }
使い方は簡単で、変換したいリスト(java.util.Collection インターフェースを実装していればよい)と、キーにするフィールド名(java.lang.String)を引数として与えればよい。
Listusers = dao.list(); Map map = Utils. toMap(user, "sectionGroupId");
Generics を利用したことにより、生成する Map で利用するキーと値を指定できて結構便利だ。