100DaysOfJava - [Day 2]JavaストリームAPIの問題

2024/04/15に公開

Java Goldの勉強をしています。100日後にできるように頑張っています。
勉強の中で気づいたことをここに書いていきます。
JavaストリームAPIで間違いやすいポイントを以下にまとめました。

1. groupingBy()partitioningBy()の違い

groupingBy()

groupingBy()メソッドは、ストリームの要素をグループ化するために使用されます。キーによるグループ化が行われ、各グループの要素はリストやセットなどのコレクションとしてマッピングされます。

List<Person> people = Arrays.asList(
    new Person("Alice", 25),
    new Person("Bob", 30),
    new Person("Charlie", 35),
    new Person("Alice", 28)
);

Map<String, List<Person>> peopleByAge = people.stream()
    .collect(Collectors.groupingBy(Person::getName));

// 結果: { "Alice" -> [Person("Alice", 25), Person("Alice", 28)], "Bob" -> [Person("Bob", 30)], "Charlie" -> [Person("Charlie", 35)] }

partitioningBy()

partitioningBy()メソッドは、ストリームの要素を2つのグループ(真偽値による)に分割するために使用されます。条件を満たす要素と満たさない要素の2つのグループに分けられます。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

Map<Boolean, List<Integer>> evenOddMap = numbers.stream()
    .collect(Collectors.partitioningBy(n -> n % 2 == 0));

// 結果: { true -> [2, 4, 6], false -> [1, 3, 5] }

2. OptionalクラスのorElseGet()メソッドの戻り値は型パラメータに従う

orElseGet()メソッドは、Optionalインスタンスが空である場合に代替値を提供するために使用されます。その際、代替値の型はOptionalの型パラメータと一致する必要があります。

Optional<String> optionalString = Optional.empty();

String result = optionalString.orElseGet(() -> "Default Value");

System.out.println(result); // 結果: "Default Value"

3. IntStream, DoubleStream, LongStreamで提供されたreduce()メソッドの第2引数はBinaryOperatorではなく対応したデータ型BinaryOperatorとなる

これは正しいポイントです。IntStream, DoubleStream, LongStreamなどのプリミティブストリームでのreduce()メソッドの第2引数は、対応したプリミティブ型のBinaryOperatorではなく、そのプリミティブ型に特化したIntBinaryOperator, DoubleBinaryOperator, LongBinaryOperatorといったインターフェースを使用します。

IntStream numbers = IntStream.rangeClosed(1, 5);

int sum = numbers.reduce(0, Integer::sum);

System.out.println(sum); // 結果: 15

このように、JavaストリームAPIにはさまざまな操作があり、それぞれのメソッドやインターフェースの使い方を正しく理解することが重要です。次回も引き続きJava Gold資格の勉強を進めていきましょう!

GitHubで編集を提案

Discussion