Unfortunately, the Stream API is not very well suited to tackle problems that involve dependant operations on the Stream element, like this one.
However, you can use the StreamEx library for this:
public static void main(String[] args) {
IntStream seq = IntStream.of(1, 2, 3, -1, -1, 1, 2, 1, 2);
IntUnaryOperator next = i -> i + 1;
List<List<Integer>> result =
IntStreamEx.of(seq).boxed().groupRuns((i1, i2) -> next.applyAsInt(i1) == i2).toList();
System.out.println(result); // prints "[[1, 2, 3], [-1], [-1], [1, 2], [1, 2]]"
}
This groups into a List
all consecutive integers where the second one is equal to the next
function applied to the first one. Finally, this Stream is collected into a List
.