Scala:如果在匹配案例中

und*_*isp 2 functional-programming if-statement scala

有没有办法将 if 放在 Scala 的火柴盒中?

像这样的东西:

def createSchedules(listTask: List[TaskOrder], physicalResources: List[Physical], humanResources: List[Human], previousTime: Duration): List[TaskSchedule] = listTask match {
    case TaskOrder(id, time, physicalRes, order) :: t =>
      val taskScheduleHumanResources = setHumanResources(physicalRes, humanResources)
      if (physicalRes != null) 
        new TaskSchedule(
          order, 
          order.getProduct(), 
          Task(id, time, physicalRes), 
          physicalRes, 
          taskScheduleHumanResources, 
          order.quantity, 
          previousTime, 
          previousTime + time) :: createSchedules(t, physicalRes, humanResources, previousTime + time)
    case Nil => Nil
  }
Run Code Online (Sandbox Code Playgroud)

这样做我得到一个错误说:

类型不匹配; 找到:所需单位:列表[Objects.TaskSchedule]

最好的方法是什么?

Yuv*_*kov 5

编译器推断的原因Unit是您没有else子句,这意味着您不会在physicalRes为 null 的情况下返回值。

您需要else在代码中添加一个子句:

case TaskOrder(id, time, physicalRes, order) :: t => 
  val taskScheduleHumanResources = setHumanResources(physicalRes, humanResources)
  if (physicalRes != null) // stuff
  else createSchedules(t, physicalRes, humanResources, previousTime + time)
Run Code Online (Sandbox Code Playgroud)

您可以使用collect仅选择想要的元素:

val res: List[TaskSchedule] = listTask.collect {
   case order if order.physicalRes != null => new TaskSchedule(...)
}
Run Code Online (Sandbox Code Playgroud)

或者,您也可以将集合折叠起来,仅在发现非空时才累积physicalRes

val res: List[TaskSchedule] = listTask.foldLeft(List.empty[TaskOrder]) {
  case (acc, order) => 
    if (order.physicalRes != null) {
       new TaskSchedule(...) :: acc
    } else acc
}
Run Code Online (Sandbox Code Playgroud)