途中で打ち切った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を返す。