我正在编写一个必须返回List[TaskSchedule]
的scala函数。
如果我这样做,它会返回所需的类型:
val taskSchedules = orders.flatMap { order => createSchedules(order, order.prod.tasks) }
问题是我要运行createSchedules
n次,所以我这样做了:
val taskSchedules = orders.map { order => (1 to order.quantity) foreach ( _ => createSchedules(order, order.prod.tasks) )}
但是这样,taskSchedules来自List[Unit]
我在这里做错了什么?
答案 0 :(得分:0)
foreach返回Unit,因此您将订单从List [OrderClass]映射到List [Unit]。
我不是百分之百确定你的目标是什么,但是,假设你的目标是最终使用相同的类型(只需从每个createSchedules创建多个结果,createSchedules也返回一个列表),那么你会想要:
val taskSchedules = orders.flatMap { order => (1 to order.quantity) flatMap ( _ => createSchedules(order, order.prod.tasks) )}
答案 1 :(得分:0)
使用for comprehension是在Scala中实现此目的的一种惯用方法。
val taskSchedules = for {
order <- orders
_ <- 1 to order.quantity
} yield createSchedules(order, order.prod.tasks)
答案 2 :(得分:0)
因为您在.foreach
内使用.map
,所以最终响应将是List[Unit]
,因为foreach
是无返回操作。例如,请参阅List#foreach
,
// Overridden with an implementation identical to the inherited one (at this time)
// solely so it can be finalized and thus inlinable.
@inline final override def foreach[U](f: A => U) {
var these = this
while (!these.isEmpty) {
f(these.head)
these = these.tail
}
}
因此,在响应很重要时更好地使用.map
,而不仅仅是点火,忘记foreach
。
示例,
<强>输入强>
scala> val orders = List(("orderA", 1), ("orderB", 2))
orders: List[(String, Int)] = List((orderA,1), (orderB,2))
返回响应的函数
scala> def scheduleOrder(order: String) = s"$order will be shipped"
scheduleOrder: (order: String)String
处理输入n次并存储结果
scala> orders.map( order => Range.inclusive(1, order._2).map(counter => scheduleOrder(counter +"-" +order._1))).flatten
res9: List[String] = List(1-orderA will be shipped, 1-orderB will be shipped, 2-orderB will be shipped)