配列に変換する
Stream<String> streamString = Stream.of("a", "b", "c");
String[] stringArray = streamString.toArray(String[]::new);
Stream同士の結合
Stream.concat(stream1, stream2, ...)
// 2つのStreamを結合する例
List<String> values = Stream.concat(
Stream.of("a", "b", "c"),
Stream.of("d", "e"))
.collect(Collectors.toList());
System.out.println(values); // -> [a, b, c, d, e]
IntStream
で数値の範囲を反復
// forを利用し1〜9までループ
List<String> values = new ArrayList<>();
for (int i = 1; i < 10; i++) {
values.add("value:" + i);
}
System.out.println(values); // -> [value:1, value:2, value:3, value:4, value:5, value:6, value:7, value:8, value:9]
// IntStreamで1〜9までのStreamを生成
List<String> values = IntStream.range(1, 10)
.boxed()
.map(value -> "value:" + value)
.collect(Collectors.toList());
System.out.println(values); // -> [value:1, value:2, value:3, value:4, value:5, value:6, value:7, value:8, value:9]
カスタムコレクタ
Stream<String> stream = Stream.of("apple", "banana", "cherry");
String result = stream.collect(
Collector.of(
StringBuilder::new,
StringBuilder::append,
StringBuilder::append,
StringBuilder::toString
)
);
System.out.println(result); // -> applebananacherry
コレクタをネストさせた例
record Person(String name, int age, String city) {
}
List<Person> people = Arrays.asList(
new Person("Alice", 23, "London"),
new Person("Bob", 28, "New York"),
new Person("Charlie", 33, "London"),
new Person("Diana", 40, "New York"),
new Person("Eve", 28, "London"),
new Person("Frank", 33, "New York")
);
Map<String, Map<Integer, List<String>>> groupedByCityAgeAndNames = people.stream()
.collect(
Collectors.groupingBy(
Person::city, Collectors.groupingBy(
Person::age, Collectors.mapping(
Person::name, Collectors.toList()
)
)
)
);
System.out.println(groupedByCityAgeAndNames); // -> {New York={33=[Frank], 40=[Diana], 28=[Bob]}, London={33=[Charlie], 23=[Alice], 28=[Eve]}}