Подтвердить что ты не робот

В Scala, что делает "просмотр"?

В частности, я рассматриваю проблему 1 здесь

http://pavelfatin.com/scala-for-project-euler/

Указанный ниже код выглядит следующим образом

val r = (1 until 1000).view.filter(n => n % 3 == 0 || n % 5 == 0).sum

Я могу следить за всем, кроме "представления". Фактически, если я выберу представление, код все еще компилируется и дает точно такой же ответ.

4b9b3361

Ответ 1

View создает ленивую коллекцию, так что вызовы, например, filter не оценивать каждый элемент коллекции. Элементы оцениваются только после их прямого доступа. Теперь sum выполняет доступ ко всем элементам, но с view вызов filter не создает полный вектор. (См. Комментарий от Стива)

Хорошим примером использования вида будет:

scala> (1 to 1000000000).filter(_ % 2 == 0).take(10).toList
java.lang.OutOfMemoryError: GC overhead limit exceeded

Здесь Scala пытается создать коллекцию с элементами 1000000000, чтобы получить доступ к первому 10. Но с представлением:

scala> (1 to 1000000000).view.filter(_ % 2 == 0).take(10).toList
res2: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

Ответ 2

Я мало что знаю о Scala, но, возможно, эта страница может помочь...

Существует два основных способа реализации трансформаторов. Один из них строгий, то есть новая коллекция со всеми ее элементами построена в результате трансформатора. Другой - нестрогий или ленивый, то есть один создает только прокси-сервер для сбора результатов, а его элементы создаются только по требованию.

A view - это особый вид коллекции, который представляет собой базовую коллекцию, но лениво реализует все трансформаторы.

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