LoginSignup
0
1

JavaでのStream操作

Last updated at Posted at 2017-01-30

配列に変換する

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]}}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1