Вложенная итерация в Scala - PullRequest
       0

Вложенная итерация в Scala

17 голосов
/ 03 сентября 2010

В чем разница (если таковая имеется) между двумя фрагментами кода ниже?

Пример из главы 7 программирования i Scala

def grep(pattern: String) = 
  for (
    file <- filesHere
    if file.getName.endsWith(".scala");
    line <- fileLines(file)
    if line.trim.matches(pattern)
  ) println(file + ": " + line.trim)

и этого

def grep2(pattern: String) = 
  for (
    file <- filesHere
    if file.getName.endsWith(".scala")
  ) for (
    line <- fileLines(file)
    if line.trim.matches(pattern)
  ) println(file + ": " + line.trim)

Или

for (i <- 1 to 2)
  for (j <- 1 to 2)
    println(i, j)

и

for (
  i <- 1 to 2;
  j <- 1 to 2
) println(i, j)

Ответы [ 2 ]

31 голосов
/ 03 сентября 2010

В этом случае нет разницы.Однако при использовании yield есть:

for (
  i <- 1 to 2;
  j <- 1 to 2
) yield (i, j)

. Даст вам последовательность, содержащую (1,1), (1,2), (2,1) и (2,2).

for (i <- 1 to 2)
  for (j <- 1 to 2)
    yield (i, j)

.ничего, потому что он генерирует последовательность (i,1), (i,2) на каждой итерации и затем выбрасывает ее.

9 голосов
/ 06 октября 2014

Иногда также полезно вывести многомерную коллекцию (например, матрицу таблицы):

for (i <- 1 to 2) yield for (j <- 1 to 2) yield (i, j)

Вернется:

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