途中で打ち切ったStreamを次の処理へ渡す

順序をもつStreamについて、
条件が初めて満たされる直前までのデータで構成されたStreamを返すような機能は、
Java 8までだと、Spliteratorとかを使って実現できなくはないけれど、
実際書いてみようとしたら面倒くさいことこの上ない。

Streamに新たに加わったメソッドはまさにそれを行ってくれる。

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Foo {
    public static void main(String[] args) {
        Set<String> s = Set.of("向日葵", "秋桜", "萵苣", "蓬", "蒲公英", "牛蒡");
        List<String> t = List.of("蓬", "萵苣", "蒲公英", "朝顔", "牛蒡", "菖蒲", "秋桜");
        System.out.println(
            t.stream().filter(s::contains).collect(Collectors.toList())
        );
        System.out.println(
            t.stream().takeWhile(s::contains).collect(Collectors.toList())
        );
        System.out.println(
            t.stream().dropWhile(s::contains).collect(Collectors.toList())
        );
    }
}
$ java Foo
[蓬, 萵苣, 蒲公英, 牛蒡, 秋桜]
[蓬, 萵苣, 蒲公英]
[朝顔, 牛蒡, 菖蒲, 秋桜]

順序をもつStreamに関して、
takeWhileは条件が初めて成立しなくなる直前までの内容を持つStreamを返す。
逆に、dropWhileは条件が初めて成立しなくなる直前までの内容を捨て、
それ以降の内容のみを持つStreamを返す。