2016-06-02 2 views
0

У меня довольно большой java.util.stream.Stream, и я хотел бы извлечь подмножество этого потока, а также получить размер всего потока источника. Я хотел бы сохранить поведение потока, поэтому я не хочу собирать этот поток в List. Это возможно ?Как получить размер базового потока при использовании count и limit?

Stream src = .... 
Stream subsetStream = src.offset(x).limit(y); 
long totalLengthOfSrc = ?? 

ответ

3

Count - это терминальная операция, означающая, что поток считается потребляемым впоследствии, поэтому использовать его нельзя. Я не думаю, что это возможно с помощью простого потокового API, но вы можете сделать это следующим образом:

final AtomicLong length = new AtomicLong(0); 
Stream subsetStream = src.filter(a -> length.getAndIncrement() < y); 

длиной может быть обычным длинным вместо этого, если вы уверены, что ЦСИ не параллельный поток , Если src - параллельный поток, длина которого больше y, то вы можете не получить первые y-элементы, а некоторые y-элементы.

+0

Хороший ответ .....! –

+2

Предел не является терминальной операцией. –

+0

'length' не может быть регулярным' long', поскольку вы не можете изменять локальные переменные окружения lambda-выражения. Однако это решение не работает параллельно с упорядоченными потоками, независимо от того, используете ли вы «AtomicLong» или любой другой «длинный» контейнер. – Holger

-1

В общем - да, это возможно. Это зависит от того, что Stream именно вы используете. Stream - это просто интерфейс, а ваш объект всегда является экземпляром определенного класса. FileInputStream, например, связал FileChannel, к которому можно получить доступ с помощью метода getChannel() и имеет метод size().

+0

'FileInputStream' не реализует' Stream'. – zeroflagL

+0

OP говорит о интерфейсе 'java.util.stream.Stream'. –

Смежные вопросы