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;
|
|
}
|
|
} |