JavaでオブジェクトのListから、MapやSetをラムダ式でさくっと作る

エキサイトのエンジニア藤沼です。 JavaでオブジェクトのListから、MapやSetをラムダ式でさくっと作る方法覚書です。

やりたい事。

  1. 下記のオブジェクトのListからidだけを取り出してSetを作る。
  2. 下記のオブジェクトのListからidをキーにした、Map<Long, SampleModel>を作る。
@Data
@Accessors(chain = true)
public class SampleModel {

    /**
     * id
     */
    @NotNull
    @Positive
    private Long id;

    /**
     * タイトル
     */
    @NotNull
    private String title;

    /**
     * 説明文
     */
    @NotNull
    private String description;

}

List<SampleModel> sampleList = List.of(
    new SampleModel()
        .setId(1L)
        .setTitle("タイトル1")
        .setDescription("説明文1"),
    new SampleModel()
        .setId(2L)
        .setTitle("タイトル2")
        .setDescription("説明文2"),
    new SampleModel()
        .setId(3L)
        .setTitle("タイトル3")
        .setDescription("説明文2")
);

forEachを使う 例

foreachを使う場合は、 最終的に入れ込む変数を外側に定義しないといけません。

Set

Set<Long> idList = new HashSet<>();
sampleList.forEach(sample -> idList.add(sample.getId()));

Map

HashMap<Long, SampleModel> sampleMap = new HashMap();
sampleList.forEach(
    sample -> sampleMap.put(sample.getId(), sample)
);

ラムダ式バージョン

ラムダ式でforEach使わずに、簡単にSetやMapが作成できます。この場合、MapやSetの変数定義をせずに、初期化と同時にデータを入れられるのがメリットです。

Set

Set<Long> idList = sampleList.stream().map(
    sample -> sample.getId()
).collect(Collectors.toSet());

Map

Map<Long, SampleModel> sampleMap = sampleList.stream().collect(
    Collectors.toMap(
        sample -> sample.getId(),
        sample -> sample
     )
);