class SpliteratorExample { private static class GroupSpliterator implements Spliterator> { private final int grouping; private final Spliterator spliterator; GroupSpliterator(int grouping, Spliterator spliterator) { this.grouping = grouping; this.spliterator = spliterator; } @Override public boolean tryAdvance(Consumer> action) { Stream.Builder builder = Stream.builder(); boolean finished = false; for (int i = 0; i < grouping; i++) { if (spliterator.tryAdvance(builder::add)) { finished = true; } } final Stream subStream = builder.build(); action.accept(subStream); return !finished; } @Override public Spliterator> trySplit() { final Spliterator aNewSpliterator = this.spliterator.trySplit(); return new GroupSpliterator(grouping, aNewSpliterator); } @Override public long estimateSize() { return spliterator.estimateSize() / grouping; } @Override public int characteristics() { return this.spliterator.characteristics(); } } public static void main(String... args) { final List data = Arrays.asList("1", "2", "3", "4", "5", "6"); final GroupSpliterator spliterator = new GroupSpliterator<>(3, data.spliterator()); final Stream> stream = StreamSupport.stream(spliterator, false); // transform the nested stream into collection final List> groupedData = stream.collect(Collectors.toList()) .stream() .map(subStream -> subStream.collect(Collectors.toList())) .collect(Collectors.toList()); // print result groupedData.forEach(list -> { final String joined = list.stream().collect(Collectors.joining(" ")); System.out.println("[" + joined + "]"); }); } }