package org.onap.vid.utils; import java.util.Iterator; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; import java.util.stream.StreamSupport; public class Streams { public static Predicate not(Predicate predicate) { return predicate.negate(); } public static Stream fromIterator(final Iterator iterator) { Iterable iterable = () -> iterator; return StreamSupport.stream(iterable.spliterator(), false); } // https://stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate private static Spliterator takeWhile( Spliterator splitr, Predicate predicate) { return new Spliterators.AbstractSpliterator(splitr.estimateSize(), 0) { boolean stillGoing = true; @Override public boolean tryAdvance(Consumer consumer) { if (stillGoing) { boolean hadNext = splitr.tryAdvance(elem -> { if (predicate.test(elem)) { consumer.accept(elem); } else { stillGoing = false; } }); return hadNext && stillGoing; } return false; } }; } public static Stream takeWhile(Stream stream, Predicate predicate) { return StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false); } }