Java8のCollectors.toMap()の使い方

javaJava8

Java8のCollectors.toMap()の使い方

Collectors.toMap()を使うことによって、ListからMapに変換することができます。

List<Dto> dataList = Arrays.asList(
  new Dto(1, "sample1"),
  new Dto(2, "sample2"),
  new Dto(3, "sample3"),
  new Dto(4, "sample4")
);

Map<Integer, String> map = dataList.stream().collect(
Collectors.toMap(
  d -> d.getAge(),
  d -> d.getName(),
  (oldVal,newVal) -> newVal,
  LinkedHashMap::new));

引数の意味は以下の通りです。

引数意味
第一引数Mapのkey
第二引数Mapのvalue
第三引数key重複時に先勝ちか後勝ちか
第四引数Mapインタフェースを実装したクラス

第三引数は、キーが重複した場合にどちらを優先するかを指定します。上記の場合は後勝ちになります。

List<Dto> dataList = Arrays.asList(
 new Dto(1, "sample1"),
 new Dto(2, "sample2"),
 new Dto(3, "sample3"),
 new Dto(4, "sample4")
);

dataListを上記に変更するとmapの中身は以下のようになります。

{1=sample1, 2=sample2, 3=sample3, 4=sample4}

次に重複しているケースで

List<Dto> dataList = Arrays.asList(
  new Dto(1, "sample1"),
  new Dto(2, "sample2"),
  new Dto(3, "sample3"),
  new Dto(3, "sample4")
);

dataListを上記に変更するとmapの中身は以下のようになります。

{1=sample1, 2=sample2, 3=sample4}

java.lang.IllegalStateException: Duplicate key

第三引数を省略すると、デフォルトでは重複エラーになります。

final List<Dto> dataList = Arrays.asList(new Dto(1, "sample1"),
    new Dto(2, "sample2"),
    new Dto(3, "sample3"),
    new Dto(3, "sample4"));
final Map<Integer, String> result = dataList.stream()
    .collect(Collectors.toMap(d -> d.getAge(), d -> d.getName()));

コメント

タイトルとURLをコピーしました