package org.tenidwa.collections.utils; import java.util.Comparator; import java.util.Iterator; import java.util.Optional; import java.util.Spliterator; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.BinaryOperator; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.IntFunction; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.function.ToDoubleFunction; import java.util.function.ToIntFunction; import java.util.function.ToLongFunction; import java.util.stream.Collector; import java.util.stream.DoubleStream; import java.util.stream.IntStream; import java.util.stream.LongStream; import java.util.stream.Stream; /** * Transforms a {@link java.util.Optional} to a {@link java.util.stream.Stream}. * @author Georgy Vlasov (suseika@tendiwa.org) * @version $Id$ * @since 0.3.0 */ public final class OptionalStream<T> implements Stream<T> { private final Optional<T> optional; private Stream<T> delegate; public OptionalStream(final Optional<T> opt) { this.optional = opt; } @Override public Stream<T> filter(Predicate<? super T> predicate) { return this.delegate().filter(predicate); } @Override public <R> Stream<R> map(Function<? super T, ? extends R> function) { return this.delegate().map(function); } @Override public IntStream mapToInt(ToIntFunction<? super T> toIntFunction) { return this.delegate().mapToInt(toIntFunction); } @Override public LongStream mapToLong(ToLongFunction<? super T> toLongFunction) { return this.delegate().mapToLong(toLongFunction); } @Override public DoubleStream mapToDouble(ToDoubleFunction<? super T> toDoubleFunction) { return this.delegate().mapToDouble(toDoubleFunction); } @Override public <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> function) { return this.delegate().flatMap(function); } @Override public IntStream flatMapToInt(Function<? super T, ? extends IntStream> function) { return this.delegate().flatMapToInt(function); } @Override public LongStream flatMapToLong(Function<? super T, ? extends LongStream> function) { return this.delegate().flatMapToLong(function); } @Override public DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> function) { return this.delegate().flatMapToDouble(function); } @Override public Stream<T> distinct() { return this.delegate().distinct(); } @Override public Stream<T> sorted() { return this.delegate().sorted(); } @Override public Stream<T> sorted(Comparator<? super T> comparator) { return this.delegate().sorted(comparator); } @Override public Stream<T> peek(Consumer<? super T> consumer) { return this.delegate().peek(consumer); } @Override public Stream<T> limit(long l) { return this.delegate().limit(l); } @Override public Stream<T> skip(long l) { return this.delegate().skip(l); } @Override public void forEach(Consumer<? super T> consumer) { this.delegate.forEach(consumer); } @Override public void forEachOrdered(Consumer<? super T> consumer) { this.delegate.forEachOrdered(consumer); } @Override public Object[] toArray() { return this.delegate().toArray(); } @Override public <A> A[] toArray(IntFunction<A[]> intFunction) { return this.delegate().toArray(intFunction); } @Override public T reduce(T t, BinaryOperator<T> binaryOperator) { return this.delegate().reduce(t, binaryOperator); } @Override public Optional<T> reduce(BinaryOperator<T> binaryOperator) { return this.delegate().reduce(binaryOperator); } @Override public <U> U reduce( U u, BiFunction<U, ? super T, U> biFunction, BinaryOperator<U> binaryOperator ) { return this.delegate().reduce(u, biFunction, binaryOperator); } @Override public <R> R collect( Supplier<R> supplier, BiConsumer<R, ? super T> biConsumer, BiConsumer<R, R> biConsumer1 ) { return this.delegate().collect(supplier, biConsumer, biConsumer1); } @Override public <R, A> R collect(Collector<? super T, A, R> collector) { return this.delegate().collect(collector); } @Override public Optional<T> min(Comparator<? super T> comparator) { return this.delegate().min(comparator); } @Override public Optional<T> max(Comparator<? super T> comparator) { return this.delegate().max(comparator); } @Override public long count() { return this.delegate().count(); } @Override public boolean anyMatch(Predicate<? super T> predicate) { return this.delegate().anyMatch(predicate); } @Override public boolean allMatch(Predicate<? super T> predicate) { return this.delegate().allMatch(predicate); } @Override public boolean noneMatch(Predicate<? super T> predicate) { return this.delegate().noneMatch(predicate); } @Override public Optional<T> findFirst() { return this.delegate().findFirst(); } @Override public Optional<T> findAny() { return this.delegate().findAny(); } @Override public Iterator<T> iterator() { return this.delegate().iterator(); } @Override public Spliterator<T> spliterator() { return this.delegate().spliterator(); } @Override public boolean isParallel() { return this.delegate().isParallel(); } @Override public Stream<T> sequential() { return this.delegate().sequential(); } @Override public Stream<T> parallel() { return this.delegate().parallel(); } @Override public Stream<T> unordered() { return this.delegate().unordered(); } @Override public Stream<T> onClose(Runnable runnable) { return this.delegate().onClose(runnable); } @Override public void close() { this.delegate().close(); } private Stream<T> delegate() { if (this.delegate == null) { if (this.optional.isPresent()) { this.delegate = Stream.of(this.optional.get()); } else { this.delegate = Stream.empty(); } } return this.delegate; } }