我必须建立一个列表,其成员应该包含或不基于每个成员的不同条件.
假设我必须验证采购订单,并且根据价格,我必须通知许多人:如果价格超过10,则必须通知主管.如果价格超过100,那么主管和经理.如果价格超过1000,那么主管,经理和主管.
我的功能应该以价格作为输入并输出要通知的人员列表.我想出了以下内容:
def whoToNotify(price:Int) = {
  addIf(price>1000, "director",
        addIf(price>100, "manager",
              addIf(price>10, "supervisor", Nil)
        )
       )
}
def addIf[A](condition:Boolean, elem:A, list:List[A]) = {
  if(condition) elem :: list else list
}
有没有更好的方法在普通Scala中执行此操作?我用我的addIf功能在这里重新发明了一些轮子吗?
请注意,价格检查只是一种简化.在现实生活中,检查在许多数据库字段上会更复杂,并且组织层次结构中的某些人不会暗示包括下面的所有人,因此截断列表解决方案将无法工作.
基本上,我想使用不可变列表来实现以下目的:
def whoToNotify(po:PurchaseOrder) = {
      val people = scala.collection.mutable.Buffer[String]()
      if(directorCondition(po)) people += "director"
      if(managerCondition(po)) people += "manager"
      if(supervisorCondition(po)) people += "supervisor"
      people.toList
}
您可以使用List#flatten()子元素构建列表。它甚至可以让您同时添加两个人(我将在下面的示例中为经理执行此操作):
def whoToNotify(price:Int) =
  List(if (price > 1000) List("director") else Nil,
       if (price > 100) List("manager1", "manager2") else Nil,
       if (price > 10) List("supervisor") else Nil).flatten