[英]Scala: if inside match case
有沒有辦法將 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
}
這樣做我得到一個錯誤說:
類型不匹配; 找到:所需單位:列表[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)
您可以使用collect
只選擇想要的元素:
val res: List[TaskSchedule] = listTask.collect {
case order if order.physicalRes != null => new TaskSchedule(...)
}
或者,您也可以將集合折疊起來,僅在找到非空的physicalRes
時才累積:
val res: List[TaskSchedule] = listTask.foldLeft(List.empty[TaskOrder]) {
case (acc, order) =>
if (order.physicalRes != null) {
new TaskSchedule(...) :: acc
} else acc
}
如果你這樣做
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)
else
Nil
}
case Nil => Nil
}
}
它應該工作
正如其他人指出的那樣,編譯器試圖推斷if
表達式的類型(它會嘗試找到if
和else
共享的第一個公共超類型)。 鑒於缺少else
,它與Unit
一起使用,因此您收到了錯誤。
如果我明白你要做什么, collect
似乎是實現這一目標的最簡單方法:
def createSchedules(listTask: List[TaskOrder], physicalResources: List[Physical], humanResources: List[Human], previousTime: Duration): List[TaskSchedule] =
listTask.collect {
case TaskOrder(id, time, physicalRes, order) if physicalRes != null =>
val taskScheduleHumanResources = setHumanResources(physicalRes, humanResources)
new TaskSchedule(
order,
order.getProduct(),
Task(id, time, physicalRes),
physicalRes,
taskScheduleHumanResources,
order.quantity,
previousTime,
previousTime + time
)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.