import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class TestParallelStream {

	public static void main(String[] args) {
		List<Integer> numbers = Collections.nCopies(2868, 0); 
		System.out.println(cycle(numbers, 10).count()); 
	} 

	public static <T> Stream<T> cycle(List<T> list, int nbIterations) { 
		return StreamSupport.stream(Spliterators.spliterator(new Iterator<T>() { 

			private final List<T> copy = new ArrayList<>(list); 
			private final AtomicInteger position = new AtomicInteger(); 

			@Override 
			public boolean hasNext() { 
				return true; 
			} 

			@Override 
			public T next() { 
				return copy.get(position.getAndUpdate(n -> (n + 1) % copy.size())); 
			} 

		}, Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED), true).limit(list.size() * nbIterations); 
	} 

}

