エキサイトのエンジニア藤沼です。 JavaでオブジェクトのListから、MapやSetをラムダ式でさくっと作る方法覚書です。
やりたい事。
- 下記のオブジェクトのListからidだけを取り出してSet
を作る。 - 下記のオブジェクトの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 ) );