※このページではアフィリエイト広告を紹介しています

配列、List、Set、Mapをつくる ~Stream API~

Java小ネタ
この記事は約6分で読めます。
広告

この記事の目的

慣れるまでに一癖ある、Stream APIで配列、List、Set、Mapをつくる方法をまとめてご紹介します。

本記事のサンプルコードを実行するには、Java 9以上が必要です。

 

配列をつくる

Stream#toArray(IntFunction<A[]> generator)を使って、配列をつくります。

List<String> fruits = List.of("Apple", "Banana", "Cherry", "Orange");

String[] fruitArray = fruits.stream()
		.toArray(String[]::new);
toArray(String[]::new)はtoArray(size -> new String[size])とも書けます。配列の要素数から、String配列を生成する関数の意味です。

 

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]

 

 

コメント

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