2015-04-08 5 views
8

Я читал Java 8 В действии поэтому я знаю, что такое Stream и как его использовать. Но, с точки зрения компьютерной науки, все данные должны храниться в виде структуры данных. Таким образом,Что такое поток Java8?

  1. Как сохранить поток?

  2. Как Stream может выполнять так много операций для множества коллекций (например, массив, связанный список, карта)?

  3. Или, может быть, Stream - это всего лишь интерфейс и всевозможные коллекции необходимы для реализации этих операций, указанных в этом интерфейсе?

Спасибо!

+2

Помогает ли это: http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html? –

+0

@RahulTripathi Мне интересно об использовании Stream – Neo

ответ

5

Одним из важных различий с потоком, по сравнению с коллекцией, является то, что Stream предназначен для ленивой оценки. Возьмем выдержку из JavaDoc

Потоки ленивы; вычисление исходных данных выполняется только при инициировании операции терминала, а исходные элементы потребляются только по мере необходимости.

Имея экземпляр, Stream не гарантирует, что все элементы этого потока будут известны. Элементы Stream вычисляются только тогда, когда они требуются. Это отражает функции, которые находятся на других функциональных языках, таких как Haskell или Scala. Вы бы использовали Stream для моделирования бесконечных списков. Например, поток, который может рассчитать последовательность Фибоначчи. Он будет вычислять только те элементы, которые были запрошены. Он не будет вычислять все элементы, поскольку он никогда не завершится.

Итак, предположение, что вы всегда можете сохранить содержимое потока, неверно. Вы только сохранили бы содержимое Stream, если бы это был конечный список, значения которого были идентифицированы. В этот момент нет смысла использовать Stream над традиционной коллекцией.

1

Возможно, Stream - это просто интерфейс, и все виды коллекций необходимы для реализации этих операций, указанных в этом интерфейсе?

Thats it. Правило: коллекция должна реализовать метод stream, который должен быть реализован по мере объяснения.

Однако интерфейс Stream предоставляет некоторые методы по умолчанию. Некоторые потоковые провайдеры делают свое собственное хранилище, например. коллекции. Другие не нуждаются в хранении, например. поставщики натуральных чисел, поставщики случайных чисел.

+1

Это неверно. Stream и Collection - это совсем разные абстракции. Сбор информации о хранении и доступе к данным; Поток - это вычислительные операции над совокупными данными. Сбор может быть источником потока, но так же может быть функция генератора или канал ввода-вывода, но это не потоки. –

1

Вы можете посмотреть источник на Collection.stream() и посмотреть, как он обрабатывается. Там нет волшебства, это обычный код Java, включающий объекты Stream и Spliterators и другие связанные классы.

Stream также не нужно хранить объекты, так как они уже хранятся в Collection, из которых создан Stream. Непараллельный поток на самом деле довольно прост.

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