Мне нужно создать список внутри цикла for, и у меня возникают проблемы с этим.

Раньше у меня был этот код, который отлично работает:

val tasksSchedules = orders.map (order => {                
    // Creates list of TaskSchedules
    order.Product.Tasks.map(task => {                     
        // Create TaskSchedule
    })        
})

Однако появилось новое требование, и теперь мне нужно повторить создание списка TaskSchedule на основе количества. Теперь у меня есть следующий код:

val tasksSchedules = orders.map (order => {
    // Repeats creation of TaskSchedules as many times as the value of Quantity
    // Creation of list is lost with this for.
    for (i <- 1 to order.Quantity) {
        // Creates list of TaskSchedules
        order.Product.Tasks.map(task => {                     
            // Create TaskSchedule
        })
    }    
})

Без цикла for все работает без проблем. Однако с циклом for не создается список, который, я думаю, следует ожидать. По сути, мне нужна конструкция цикла for, которая позволит мне выполнять итерации до определенного значения и вести себя как функция map, поэтому я также могу создавать список.

Что-то подобное существует? Это возможно?

1
João Paiva 28 Май 2017 в 21:30

2 ответа

Лучший ответ

Когда вы делаете цикл for, для генерации списка вам нужно использовать команду yield :

val tasksSchedules = orders.map (order => {
  // Repeats creation of TaskSchedules as many times as the value of Quantity
  // Creation of list is lost with this for.
  for (i <- 1 to order.Quantity) yield {
      // Creates list of TaskSchedules
      order.Product.Tasks.map(task => {                     
          // Create TaskSchedule
      })
  }    

})

В этом случае это даст вам список списка.

Если вам просто нужен список из списка, используйте flatmap вместо map.

2
Assaf Mendelson 28 Май 2017 в 18:37

Что бы это ни стоило, простое понимание просто переписывается как map() вызовы. Вместо вашей текущей реализации (которая является IMO, несовместимой), вы можете просто переписать ее, используя map() s:

val tasksSchedules = orders.map { order =>
  // Repeats creation of TaskSchedules as many times as the value of Quantity
  // Creation of list is lost with this for.
  (1 to order.Quantity).toSeq.map { i =>
    // Creates list of TaskSchedules
    order.Product.Tasks.map { task =>
      // Create TaskSchedule
    }
  }
}

Или просто для понимания:

val tasksSchedules = for (order <- orders) yield {
  // Repeats creation of TaskSchedules as many times as the value of Quantity
  // Creation of list is lost with this for.
  for (i <- (1 to order.Quantity).toSeq) yield {
    // Creates list of TaskSchedules
    for (task <- order.Product.Tasks) yield {
      // Create TaskSchedule
    }
  } 
}
2
Jack Leow 29 Май 2017 в 23:55