我必须建立一个列表,其成员应该包含或不基于每个成员的不同条件.
假设我必须验证采购订单,并且根据价格,我必须通知许多人:如果价格超过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
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法在普通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
}
Run Code Online (Sandbox Code Playgroud)
您可以使用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
Run Code Online (Sandbox Code Playgroud)