Streamの終端処理

void forEach(Consumer<? super T> action)

要素を順に処理する ※forEachメソッドは並列ストリームでは順序を保証しない為、順序を保証したいならforEachOrderedメソッドを使うこと

Stream.of("beckham", "zidane", "ronald").forEach(v -> System.out.println(v));

Optional findFirst()

最初の要素をOptionalで記述する ※並列ストリームで何でもよいので1件だけ取得するのであればfindAnyメソッドを使った方がパフォーマンスが良い

Optional<String> optional = Stream.of("beckham", "zidane", "ronald").findFirst();
System.out.println(optional.get());

boolean allMatch(Predicate<? super T> predicate)

boolean anyMatch(Predicate<? super T> predicate)

boolean noneMatch(Predicate<? super T> predicate)

それぞれ条件を満たす要素の存在をチェックする

System.out.println(IntStream.of(1, 3, 2).allMatch(v -> v >= 2)); // false ※全ての要素が条件を満たすか?
System.out.println(IntStream.of(1, 3, 2).anyMatch(v -> v >= 2)); // true ※いずれかの要素が条件を満たすか?
System.out.println(IntStream.of(1, 3, 2).noneMatch(v -> v >= 4)); // true ※条件を満たす要素が存在しないか?

Object toArray()

A toArray(IntFunction<A[]> generator)

要素の配列を返却する

int[] array = IntStream.of(1, 3, 2).toArray();
Person[] men = people.stream().toArray(Person[]::new);

R collect(Supplier supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)

このストリームの要素に対して可変リダクション操作を実行する。 Collectionの入れ替えなんかで利用する。

List<String> list = Stream.of("beckham", "zidane", "ronald").collect(Collectors.toList());
Set<String> set = Stream.of("beckham", "zidane", "ronald").collect(Collectors.toSet());
Map<String, String> map = Stream.of("beckham", "zidane", "ronald").collect(Collectors.toMap(String::toString, String::toString));

Optional min(Comparator<? super T> comparator)

Optional max(Comparator<? super T> comparator)

指定されたComparatorによる順序に従って、最小/最大の要素を取得する

Optional<Integer> min = List.of(3, 8, 7, 10, 5, 1, 9, 2, 4, 6).stream().min(Comparator.naturalOrder());
Optional<Integer> max = List.of(3, 8, 7, 10, 5, 1, 9, 2, 4, 6).stream().max(Comparator.naturalOrder());

long count()

要素の個数を取得する

long count = List.of(3, 8, 7, 10, 5, 1, 9, 2, 4, 6).stream().count();

int sum()

OptionalDouble average()

合計/平均を求める

int sum = IntStream.of(3, 8, 7, 10, 5, 1, 9, 2, 4, 6).sum();
OptionalDouble average = IntStream.of(3, 8, 7, 10, 5, 1, 9, 2, 4, 6).average();

Optional reduce(BinaryOperator accumulator)

T reduce(T identity, BinaryOperator accumulator)

U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator combiner)

リダクションを実行する

Optional<String> optional = Stream.of("beckham", "zidane", "ronald").reduce((result, str) -> result + "/" + str);

// 初期値あり、非nullなので戻り値はOptionalではない
String reduce = Stream.of("beckham", "zidane", "ronald").reduce("figo", (result, str) -> result + "/" + str);

// Streamの型と最終結果の型が異なる場合に使用する
Integer reduce = Stream.of("beckham", "zidane", "ronald").parallel().reduce(
        0, // 初期値
        // 個々の要素を処理してまとめる
        (result, value) -> { 
            System.out.println("##################");
            System.out.println(result);
            System.out.println(value);
            return result += value.length();
        }, 
        // 並列処理の結果をまとめる
        (result1, result2) -> {
            System.out.println(result1);
            System.out.println(result2);
            return result1 + result2;
        });

R collect(Supplier supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)

<R,A> R collect(Collector<? super T,A,R> collector)

要素をコレクションにまとめる

List<String> result = Stream.of("beckham", "zidane", "ronald")
    .collect(
            ArrayList<String>::new, 
            (list, str) -> list.add(str),
            (list1, list2) -> list1.addAll(list2));
List<String> result = Stream.of("beckham", "zidane", "ronald")
    .collect(
        Collector.of(   
            ArrayList<String>::new,
            ArrayList<String>::add,
            (list1, list2) -> {
                list1.addAll(list2);
                return list1;
            },
            Collector.Characteristics.IDENTITY_FINISH
        )
    );
String collect = Stream.of("beckham", "zidane", "ronald").collect(Collectors.joining(",", "<", ">"));
System.out.println(collect); // <beckham,zidane,ronald>