Can You Split A Stream Into Two Streams?
Answer : A collector can be used for this. For two categories, use Collectors.partitioningBy() factory. This will create a Map from Boolean to List , and put items in one or the other list based on a Predicate . Note: Since the stream needs to be consumed whole, this can't work on infinite streams. And because the stream is consumed anyway, this method simply puts them in Lists instead of making a new stream-with-memory. You can always stream those lists if you require streams as output. Also, no need for the iterator, not even in the heads-only example you provided. Binary splitting looks like this: Random r = new Random(); Map<Boolean, List<String>> groups = stream .collect(Collectors.partitioningBy(x -> r.nextBoolean())); System.out.println(groups.get(false).size()); System.out.println(groups.get(true).size()); For more categories, use a Collectors.groupingBy() factory. Map<Object, List<String>> groups = stream ...