Да, има начин да направите това, но с някои ограничения.
Stream<Integer> infiniteStream = Stream.iterate( 0, x -> new Integer(x + 1) );
Iterator<Integer> iter = infiniteStream.iterator();
Integer zero = iter.next();
Integer one = iter.next();
Алтернативно,
Stream<Integer> infiniteStream = Stream.iterate( 0, x -> new Integer(x + 1) );
Spliterator<Integer> spliterator = infiniteStream.spliterator();
spliterator.tryAdvance(i -> System.out.println(i)); // zero
spliterator.tryAdvance(i -> System.out.println(i)); // one
При даден Stream
е възможно да получите Iterator
или Spliterator
от него или да направите заявка дали е паралелен поток и т.н. Те са дефинирани на BaseStream
интерфейс, суперинтерфейс на Stream
, което ги прави малко лесни за пропускане.
В този случай знаем, че потокът е безкраен, така че няма нужда да извикваме hasNext()
метода на Iterator или да проверяваме върнатата стойност на tryAdvance()
на Spliterator
Ограничението е, че и двата метода iterator()
и spliterator()
на Stream
са терминални операции, което означава, че след като бъдат извикани, върнатият итератор или сплитератор има изключителен достъп до стойностите, представени от потока. Допълнителни операции в потока (като filter
или map
и т.н.) не са разрешени и ще бъдат посрещнати с IllegalStateException
.
Ако искате да отлепите първите няколко елемента и след това да възобновите обработката на потока, можете да превърнете сплитератора обратно в поток по следния начин:
Stream<Integer> stream2 = StreamSupport.stream(spliterator, false);
Това вероятно ще работи добре за някои неща, но не съм сигурен, че бих препоръчал тази техника като цяло. Мисля, че добавя няколко допълнителни обекта и по този начин допълнителни извиквания на метод в пътя за създаване на следващия елемент.
Редакционни коментари (несвързани с вашия въпрос):
- Не използвайте
new Integer(val)
. Вместо това използвайте Integer.valueOf(val)
, което ще използва отново поставеното в кутия цяло число, ако е налично, което обикновено е вярно за стойности в диапазона от -128 до 127.
- Можете да използвате
IntStream
вместо Stream<Integer>
, което напълно избягва режийните полета. Той няма пълния набор от поточни операции, но има iterate()
, който приема функция, която работи с примитивни int
стойности.
person
Stuart Marks
schedule
27.10.2014
.skip(n)
е начинът да го направите. - person David Conrad   schedule 27.10.2014