Насколько легко выполнить ленивую оценку, преобразовав не ленивую коллекцию в поток?
Это может быть глупый вопрос, но я некоторое время не был уверен в этом. Давайте предположим, что это повторяет наш список три раза:
def doSomething(list: List[Int]): List[Int] =
list.map(...).flatMap(...).map(...)
Если я вместо этого сделаю:
def doSomething(list: List[Int]): List[Int] =
list.toStream.map(...).flatMap(...).map(...).toList
Я гарантированно одна итерация?
1 ответ
Решение
Насколько я знаю, преобразование в.toStream должно выполнить итерацию только один раз.
Тем не менее, более стандартный способ сделать это использует .view
а потом .force
в конце
def doSomething(list: List[Int]): List[Int] =
list.view.map(...).flatMap(...).map(...).force
С помощью .view
на коллекции возвращает ленивую версию этого и вызова .force
на ленивый вид создает коллекцию.