В чем разница между методами итератора и представления? - PullRequest
29 голосов
/ 25 января 2011
scala> (1 to 10).iterator.map{_ * 2}.toList
res1: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

scala> (1 to 10).view.map{_ * 2}.force
res2: Seq[Int] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

Кроме использования next, hasNext, когда я должен выбрать итератор для просмотра или просмотр для итератора?

Ответы [ 3 ]

37 голосов
/ 26 января 2011

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

scala> val list = List(1,2,3).map{x => println(x); x * 2}
1
2
3
list: List[Int] = List(2, 4, 6)

scala> list(2)
res14: Int = 6

scala> list(2)
res15: Int = 6

scala> val view = List(1,2,3).view.map{x => println(x); x * 2}
view: scala.collection.SeqView[Int,Seq[_]] = SeqViewM(...)

scala> view(2)
3
res12: Int = 6

scala> view(2)
3
res13: Int = 6

scala> val iterator = List(1,2,3).iterator.map{x => println(x); x * 2}
iterator: Iterator[Int] = non-empty iterator

scala> iterator.drop(2).next
1
2
3
res16: Int = 6

scala> iterator.drop(2).next
[Iterator.next] (Iterator.scala:29)
(access lastException for the full trace)
21 голосов
/ 25 января 2011

view создает ленивую коллекцию / поток.Его главная прелесть в том, что он не будет пытаться собрать всю коллекцию.Это может предотвратить OutOfMemoryError или повысить производительность, когда вам нужны только первые несколько элементов в коллекции.iterator не дает такой гарантии.

Еще одна вещь.По крайней мере, на Range, view возвращает SeqView, который является подтипом Seq, так что вы можете вернуться назад или начать заново с самого начала и делать все эти забавные последовательности.

Полагаю, что разница между итератором и представлением - это вопрос спереди и сзади.Ожидается, что итераторы выпустят увиденное.Как только next был вызван, предыдущий, надеюсь, отпущен.Взгляды - это обратное.Они обещают не приобретать то, что не было запрошено.Если у вас есть представление всех простых чисел, бесконечное множество, оно получило только те простые числа, которые вы просили.Если вы хотели 100-е, 101 не должен занимать память.

0 голосов
/ 02 декабря 2015

Эта страница говорит о том, когда использовать представления.

Таким образом, представления являются мощным инструментом для решения проблем эффективность с проблемами модульности. Но чтобы не быть запутавшись в аспектах отложенной оценки, вы должны ограничить взгляды в двух сценариях. Либо вы применяете представления в чисто функциональном коде где преобразования коллекции не имеют побочных эффектов. Или ты применить их к изменяемым коллекциям, где все изменения сделаны в явном виде. Чего лучше избегать, так это сочетания мнений и операций. которые создают новые коллекции, но также имеют побочные эффекты.

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