簡體   English   中英

Scala:如果在匹配案例中

[英]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表達式的類型(它會嘗試找到ifelse共享的第一個公共超類型)。 鑒於缺少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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM