mirror of
https://github.com/BentoBoxWorld/Level.git
synced 2024-09-20 18:11:05 +02:00
38 lines
1.0 KiB
Java
38 lines
1.0 KiB
Java
|
package world.bentobox.level;
|
||
|
|
||
|
import java.util.Spliterator;
|
||
|
import java.util.Spliterators;
|
||
|
import java.util.function.Consumer;
|
||
|
import java.util.function.Predicate;
|
||
|
|
||
|
/**
|
||
|
* Java 8 version of Java 9's forWhile
|
||
|
* https://www.baeldung.com/java-break-stream-foreach
|
||
|
* @author tastybento
|
||
|
*
|
||
|
* @param <T>
|
||
|
*/
|
||
|
public class CustomSpliterator<T> extends Spliterators.AbstractSpliterator<T> {
|
||
|
|
||
|
private Spliterator<T> splitr;
|
||
|
private Predicate<T> predicate;
|
||
|
private boolean isMatched = true;
|
||
|
|
||
|
public CustomSpliterator(Spliterator<T> splitr, Predicate<T> predicate) {
|
||
|
super(splitr.estimateSize(), 0);
|
||
|
this.splitr = splitr;
|
||
|
this.predicate = predicate;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public synchronized boolean tryAdvance(Consumer<? super T> consumer) {
|
||
|
boolean hadNext = splitr.tryAdvance(elem -> {
|
||
|
if (predicate.test(elem) && isMatched) {
|
||
|
consumer.accept(elem);
|
||
|
} else {
|
||
|
isMatched = false;
|
||
|
}
|
||
|
});
|
||
|
return hadNext && isMatched;
|
||
|
}
|
||
|
}
|