Ответ 1
Предупреждение: по крайней мере, начиная с Scala 2.9.0, это оставляет исходный итератор пустым. Вы можете val ls = it.toList; val it1 = ls.iterator; val it2 = ls.iterator
получить две копии. Или используйте дубликат (который работает и для не-списков).
Ответ Rex по книге, но на самом деле ваше оригинальное решение на сегодняшний день является наиболее эффективным для scala.collection.immutable.List's.
Список итераторов можно дублировать с использованием этого механизма, при этом, по существу, не накладные расходы. Это может быть подтверждено быстрым обзором реализации итератора() в scala.collection.immutable.LinearSeq, esp. определение метода toList, который просто возвращает _.toList поддержки Seq, который, если он является списком (как и в вашем случае), является личным.
Я не знал об этом свойстве итераторов List, прежде чем исследовать ваш вопрос, и я очень благодарен за информацию... среди прочего, это означает, что многие алгоритмы "перекачки списка" могут эффективно выполняться над Scala неизменяемые списки, использующие итераторы как гальки.