Java でリストをマップに変換する

データベースから取得したデータは、独自クラスか 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)を引数として与えればよい。

List users = dao.list();
Map map = Utils. toMap(user, "sectionGroupId");

Generics を利用したことにより、生成する Map で利用するキーと値を指定できて結構便利だ。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.