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]
最好的方法是什么?
编译器推断的原因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)