JavaのStream APIには、中間操作と終端操作の2種類の操作があります。中間操作は、元のストリームを変換し、別のストリームを返す操作です。
以下に、いくつかの中間操作とその説明を示します。
filter()メソッドは、ストリーム内の各要素に対して指定された条件をテストし、条件に合致する要素だけを含む新しいストリームを生成します。以下は、filter()メソッドを使用して、数値のリストから偶数だけを含む新しいストリームを生成する例です。
import java.util.stream.*;
import java.util.List;
import java.util.Arrays;
class Main{
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0);
evenNumbers.forEach(System.out::println);
}
}
map()メソッドは、ストリーム内の各要素に対して指定された関数を適用し、その結果を含む新しいストリームを生成します。以下は、map()メソッドを使用して、文字列リストから各文字列の長さを含む新しいストリームを生成する例です。
import java.util.stream.*;
import java.util.List;
import java.util.Arrays;
class Main{
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
Stream<Integer> wordLengths = words.stream().map(String::length);
wordLengths.forEach(System.out::println);
}
}
flatMap()メソッドは、各入力要素に対してストリームを生成し、そのストリームの要素を単一のストリームにフラット化します。以下は、flatMap()メソッドを使用して、文字列リストの各要素を単語に分割し、それらを含む新しいストリームを生成する例です。
import java.util.stream.*;
import java.util.List;
import java.util.Arrays;
class Main{
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1,2,3);
List<Integer> list2 = Arrays.asList(4,5,6);
List<Integer> list3 = Arrays.asList(7,8,9);
List<List<Integer>> nestedList = Arrays.asList(list1,list2,list3);
System.out.println(nestedList);
// flatMapでflat化
nestedList
.stream()
.flatMap(list -> list.stream())
.forEach(System.out::println);
}
}
distinct()メソッドは、ストリーム内の重複する要素を除去し、新しいストリームを生成します。以下は、distinct()メソッドを使用して、数値のリストから重複を除いた要素だけを含む新しいストリームを生成する例です。
import java.util.stream.*;
import java.util.List;
import java.util.Arrays;
class Main{
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 5, 3, 6, 7, 5, 8, 9, 4, 10);
Stream<Integer> distinctNumbers = numbers.stream().distinct();
distinctNumbers.forEach(System.out::println);
}
}