Насколько легко выполнить ленивую оценку, преобразовав не ленивую коллекцию в поток?

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

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 на ленивый вид создает коллекцию.

Другие вопросы по тегам