Scala:map函数没有返回所需的结果

时间:2017-05-25 17:13:25

标签: scala list foreach

我正在编写一个必须返回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]

类型

我在这里做错了什么?

3 个答案:

答案 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)