Поток в производственном коде - PullRequest
7 голосов
/ 19 марта 2011

Люди действительно используют класс Scala Stream в производственном коде, или это в первую очередь представляет академический интерес?

Ответы [ 5 ]

4 голосов
/ 20 марта 2011

Нет проблем с Stream, за исключением случаев, когда люди используют его для замены Iterator - в отличие от замены List, которая является наиболее похожей на эту коллекцию. В этом конкретном случае нужно быть осторожным в его использовании. С другой стороны, нужно также соблюдать осторожность, используя Iterator, поскольку каждый элемент может повторяться только один раз.

Итак, поскольку у обоих есть свои проблемы, почему стоит выделить Stream? Полагаю, просто люди привыкли к Iterator с Java, тогда как Stream - это функциональная вещь.

3 голосов
/ 20 марта 2011

Смотрите здесь .В этом блоге рассказывается, как использовать Scala Streams (вместе с отображенным в памяти файлом) для эффективного чтения больших файлов (1-2G).

Я еще не пробовал, но решение выглядит разумным.Stream предоставляет отличную абстракцию поверх низкоуровневого ByteBuffer Java API для обработки файла отображения памяти в виде последовательности записей.

3 голосов
/ 19 марта 2011

Несмотря на то, что я написал, что Итератор - это то, что я хочу использовать почти все время Я использую Stream в рабочем коде.Я просто автоматически не предполагаю, что клетки собирают мусор.

Иногда Stream идеально подходит для решения проблемы.Я думаю, API дает несколько хороших примеров , где участвует рекурсия ...

2 голосов
/ 19 марта 2011

Да, я им пользуюсь, хотя обычно бывает что-то вроде этого:

(as.toStream collect expensiveConversionToB) match {
  case b #:: _ => //found my expensive b
  case _       =>
}

Конечно, я мог бы использовать нестрогое представление и find для этого примера

1 голос
/ 19 марта 2011

Поскольку единственная причина не использовать Stream s заключается в том, что может быть сложно убедиться, что JVM не хранит ссылки на ранние вычисления вокруг, один из подходов, который я использовал, довольно приятный, - создать * 1002.* и немедленно преобразовать его в Iterator для фактического использования.Он теряет немного приятных свойств Stream на стороне использования, особенно в отношении возврата, но если вы собираетесь сделать только один проход по результату, зачастую проще построить структуру таким образом, чем преобразовать вhasNext / next() модель Iterator напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...