2009-10-06 3 views

ответ

42

Поток memoises и Итератор нет. Вы можете проходить один и тот же поток несколько раз и получать одинаковый результат каждый раз. Итератор, с другой стороны, может быть пройден только один раз.

+1

Что касается memoization - если я обращаюсь к элементу Nth, это время доступа O (1) или O (N)? – ryeguy

+7

@ryeguy Это O (n), потому что Stream создает связанный список для кеширования значений элементов. –

+1

Хорошо, так в чем же разница между Stream и Iterable? –

18

Это обе конструкции для доступа к текущему элементу, имеющие еще неизвестный список оставшихся элементов (ленивый хвост).

Iterator - это императивная конструкция, которую вы можете пройти только один раз.

Stream - функциональная конструкция. Теоретически вы можете проходить его несколько раз (и, как упоминалось в других публикациях, он не будет компрометировать уже вычисленные части), но на практике, потому что потоки либо бесконечны, либо очень велики (именно поэтому вы его используете в первую очередь), удерживая ссылка на полный поток не имеет особого смысла (вы легко справляетесь с Out Of Memory).

Вообще безопаснее для ума избегать простых Stream s. Альтернативы используют EphemeralStream Scalaz, который автоматически забывает незакрепленные детали, используя слабые ссылки, или используя Iteratees (см. Также here) или something similiar.

+0

Мне любопытно: почему EphemeralStream не является реализацией по умолчанию? Вы всегда можете восстановить забытую часть из линии данных (ее функциональный язык). Это звучит как большой недостаток дизайна. – tribbloid

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