この記事の目的
慣れるまでに一癖ある、Stream APIで配列、List、Set、Mapをつくる方法をまとめてご紹介します。
配列をつくる
Stream#toArray(IntFunction<A[]> generator)を使って、配列をつくります。
List<String> fruits = List.of("Apple", "Banana", "Cherry", "Orange"); String[] fruitArray = fruits.stream() .toArray(String[]::new);
Listをつくる
Stream#collectメソッドの引数にCollectors#toListを渡して、Listをつくります。下記の例では、果物名のListから、5文字を超える果物名のListをつくっています。
List<String> fruits = List.of("Apple", "Banana", "Cherry", "Orange"); List<String> longNameFruits = fruits.stream() .filter(fruit -> fruit.length() > 5) .collect(Collectors.toList());
Banana Cherry Orange
Setをつくる
Stream#collectメソッドの引数にCollectors#toSetを渡して、Setをつくります。
List<String> fruits = List.of("Apple", "Banana", "Cherry", "Banana"); Set<String> fruitSet = fruits.stream() .collect(Collectors.toSet());
SetなのでBananaの重複は除外されます。
Apple Cherry Banana
Mapをつくる
自由にkeyとvalueを指定(toMap)
Stream#collectメソッドの引数にCollectors#toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper)を渡して、Mapをつくります。
List<String> fruits = List.of("Apple", "Banana", "Cherry", "Orange"); Map<String, Integer> fruitMap = fruits.stream() .collect(Collectors.toMap(Function.identity(), String::length));
keyをフルーツ名そのもの、valueをフルーツ名の文字列長にマッピングしています。
Apple=5 Cherry=6 Orange=6 Banana=6
グループ分け(groupingBy)
単純なケース
Stream#collectメソッドの引数にCollectors#groupingBy(Function<? super T, ? extends K> classifier)を渡して、Mapをつくります。下記の例ではフルーツ名の文字列長でグループ分けしています。
List<String> fruits = List.of("Apple", "Banana", "Cherry", "Orange"); Map<Integer, List<String>> fruitMap = fruits.stream() .collect(Collectors.groupingBy(String::length));
5文字のAppleと、6文字の[Banana, Cherry, Orange]でグループ分けされました。
5=[Apple] 6=[Banana, Cherry, Orange]
valueを加工したいケース
Stream#collectメソッドの引数にCollectors#groupingBy(Function<? super T, ? extends K> classifier,
Collector<? super T, A, D> downstream)を渡して、Mapをつくります。下記の例ではフルーツ名の文字列長でグループ分けした後、フルーツ名を大文字に変換してからListに格納しています。
List<String> fruits = List.of("Apple", "Banana", "Cherry", "Orange"); Map<Integer, List<String>> fruitMap = fruits.stream() .collect(Collectors.groupingBy(String::length, Collectors.mapping(String::toUpperCase, Collectors.toList())));
5文字のAPPLEと、6文字の[BANANA, CHERRY, ORANGE]でグループ分けされました。
5=[APPLE] 6=[BANANA, CHERRY, ORANGE]
コメント