Une telle opération devrait être possible avec un Java 8 Stream
mais elle ne peut pas nécessairement être effectuée de manière efficace. Par exemple, on ne peut pas nécessairement paralléliser une telle opération, car il faut regarder les éléments dans l'ordre.
L'API ne fournit pas de moyen facile de le faire, mais le moyen le plus simple est probablement de prendre Stream.iterator()
Enveloppez le Iterator
d'avoir une implémentation "take-while", et ensuite de revenir à une Spliterator
et ensuite un Stream
. Ou -- peut-être -- envelopper le Spliterator
bien qu'il ne puisse plus vraiment être divisé dans cette implémentation.
Voici une implémentation non testée de takeWhile
sur un Spliterator
:
static <T> Spliterator<T> takeWhile(
Spliterator<T> splitr, Predicate<? super T> predicate) {
return new Spliterators.AbstractSpliterator<T>(splitr.estimateSize(), 0) {
boolean stillGoing = true;
@Override public boolean tryAdvance(Consumer<? super T> consumer) {
if (stillGoing) {
boolean hadNext = splitr.tryAdvance(elem -> {
if (predicate.test(elem)) {
consumer.accept(elem);
} else {
stillGoing = false;
}
});
return hadNext && stillGoing;
}
return false;
}
};
}