2019年01月20日

Java ラムダ式を使ってListからMapへ変換する

ListからMapへデータを入れ替えたい場合があります。
具体的には、データベースから取得したマスタのエンティティクラスのListがすでにあり、 これをレコードのIDをキーにMapでデータを持たせたい場合です。
その実装方法について書きます。

始める前に以下の"人員クラス"を用意します。
/**
* 人員クラス
*/
public class Person {
/** ID (業務ルールで一意制約あり)*/
private int id;
/** 名前 */
private String name;
/** 所属 */
private String department;
/** 年齢 */
private int age;
// Eclipseの機能で「getterの生成」「フィールドを使用してコンストラクタの生成」「toString()を生成」を行う。
// コード記載は省略
}
サンプルデータとして、人員クラスのListがあるものとします。
// ここではベタ書きですが実際はDBやCSVファイルから取得します。
List<Person> myList = Arrays.asList(
new Person(100, "太郎", "営業部", 20),
new Person(200, "花子", "営業部", 33),
new Person(300, "次郎", "開発部", 25),
new Person(400, "良子", "開発部", 41),
new Person(500, "三郎", "総務部", 36));
変換方法
@For文で1要素ごとにputする
まず、最初に思いつくのがこの方法。一番無難です。
Map<Integer, Person> personMap1 = new HashMap<>();
for (Person cur : myList) {
personMap1.put(cur.getId(), cur);
}

// 内容確認
personMap1.entrySet().stream().forEach(s -> System.out.println(s.getValue()));
Aラムダ式でtoMapを使って記述する方法
1行で簡潔に記述できました。
Map<Integer, Person> personMap2 = myList.stream().collect(Collectors.toMap(Person::getId, Function.identity()));

// 内容確認
personMap2.entrySet().stream().forEach(s -> System.out.println(s.getValue()));
応用編
部署名で束ねてMap生成
部署名をキーに、部署名ごとの人員クラスのListを値として持たせるMapを生成します。
Map<String, List<Person>> personMap3 = myList.stream().collect(Collectors.groupingBy(Person::getDepartment));

// 内容確認
personMap3.entrySet().stream().forEach(s -> System.out.println(s + ":" + s.getValue()));


タグ:JAVA Eclipse
posted by Hiro at 00:48| Comment(0) | プログラム
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: