import java.util.*; import java.util.function.*; import java.util.stream.*; class Demo { void test() { List list = Arrays.asList(1, 2, 3); List target = new ArrayList<>(); from(list).toList(target); System.out.println(target.isEmpty()); } static SmartStream from(Collection collection) { return asSmart(collection.stream()); } static SmartStream asSmart(Stream stream) { if (stream instanceof SmartStream) { return ((SmartStream) stream); } else { return new SmartStream<>(stream); } } static class SmartStream implements Stream { private final Stream stream; protected SmartStream(Stream stream) { this.stream = stream; } public > C toList(C destination) { return stream.collect(Collectors.toCollection(() -> destination)); } @Override public SmartStream filter(Predicate predicate) { return asSmart(stream.filter(predicate)); } @Override public SmartStream map(Function mapper) { return asSmart(stream.map(mapper)); } @Override public IntStream mapToInt(ToIntFunction mapper) { return stream.mapToInt(mapper); } @Override public LongStream mapToLong(ToLongFunction mapper) { return stream.mapToLong(mapper); } @Override public DoubleStream mapToDouble(ToDoubleFunction mapper) { return stream.mapToDouble(mapper); } @Override public SmartStream flatMap(Function> mapper) { return asSmart(stream.flatMap(mapper)); } @Override public IntStream flatMapToInt(Function mapper) { return stream.flatMapToInt(mapper); } @Override public LongStream flatMapToLong(Function mapper) { return stream.flatMapToLong(mapper); } @Override public DoubleStream flatMapToDouble(Function mapper) { return stream.flatMapToDouble(mapper); } @Override public SmartStream distinct() { return asSmart(stream.distinct()); } @Override public SmartStream sorted() { return asSmart(stream.sorted()); } @Override public SmartStream sorted(Comparator comparator) { return asSmart(stream.sorted(comparator)); } @Override public SmartStream peek(Consumer action) { return asSmart(stream.peek(action)); } @Override public SmartStream limit(long maxSize) { return asSmart(stream.limit(maxSize)); } @Override public SmartStream skip(long n) { return asSmart(stream.skip(n)); } @Override public void forEach(Consumer action) { stream.forEach(action); } @Override public void forEachOrdered(Consumer action) { stream.forEachOrdered(action); } @Override public Object[] toArray() { return stream.toArray(); } @SuppressWarnings("SuspiciousToArrayCall") @Override public A[] toArray(IntFunction generator) { return stream.toArray(generator); } @Override public T reduce(T identity, BinaryOperator accumulator) { return stream.reduce(identity, accumulator); } @Override public Optional reduce(BinaryOperator accumulator) { return stream.reduce(accumulator); } @Override public U reduce(U identity, BiFunction accumulator, BinaryOperator combiner) { return stream.reduce(identity, accumulator, combiner); } @Override public R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner) { return stream.collect(supplier, accumulator, combiner); } @Override public R collect(Collector collector) { return stream.collect(collector); } @Override public Optional min(Comparator comparator) { return stream.min(comparator); } @Override public Optional max(Comparator comparator) { return stream.max(comparator); } @Override public long count() { return stream.count(); } @Override public boolean anyMatch(Predicate predicate) { return stream.anyMatch(predicate); } @Override public boolean allMatch(Predicate predicate) { return stream.allMatch(predicate); } @Override public boolean noneMatch(Predicate predicate) { return stream.noneMatch(predicate); } @Override public Optional findFirst() { return stream.findFirst(); } @Override public Optional findAny() { return stream.findAny(); } @Override public Iterator iterator() { return stream.iterator(); } @Override public Spliterator spliterator() { return stream.spliterator(); } @Override public boolean isParallel() { return stream.isParallel(); } @Override public SmartStream sequential() { return asSmart(stream.sequential()); } @Override public SmartStream parallel() { return asSmart(stream.parallel()); } @Override public SmartStream unordered() { return asSmart(stream.unordered()); } @Override public SmartStream onClose(Runnable closeHandler) { return asSmart(stream.onClose(closeHandler)); } @Override public void close() { stream.close(); } } }