Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 基于条件构建不可变列表_Scala - Fatal编程技术网

Scala 基于条件构建不可变列表

Scala 基于条件构建不可变列表,scala,Scala,我必须建立一个列表,根据每个人的不同条件,包括或不包括哪些成员 假设我必须验证采购订单,并且根据价格,我必须通知许多人:如果价格超过10,则必须通知主管。如果价格超过100美元,那么主管和经理都要支付。如果价格超过1000美元,则由主管、经理和董事决定 我的函数应该将价格作为输入,并输出要通知的人员列表。我得出了以下结论: def whoToNotify(price:Int) = { addIf(price>1000, "director", addIf(price&g

我必须建立一个列表,根据每个人的不同条件,包括或不包括哪些成员

假设我必须验证采购订单,并且根据价格,我必须通知许多人:如果价格超过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
}

好吧,这是一个风格问题,但我更喜欢保留一个用规则通知的人员列表,而不是函数嵌套。在上面的例子中,我认为像
addIf
这样的东西没有多大价值

我的解决方案

val notifyAbovePrice = List(
    (10, "supervisor"),
    (100, "manager"),
    (1000, "director"))

def whoToNotify(price: Int): Seq[String] = {
  notifyAbovePrice.takeWhile(price > _._1).map(_._2)
}

在现实世界中,如果没有订单或订单并不意味着在较低级别上通知,则可以使用对象
notifyUpperPrice
而不是元组,并使用
filter
而不是
takeWhile

如果您有原始成员列表,您可能想考虑使用<代码>过滤器>代码>方法。如果您还想转换成员对象,以便在末尾具有不同类型的列表,请查看采用分部函数的
collect
方法。

您可以使用
list#flatte()
从子元素构建列表。它甚至可以让您同时添加两个人(我将为下面示例中的经理这样做):


好吧,这是风格的问题,但我会这样做,以使所有条件都更符合-

case class Condition(price: Int, designation: String)

val list = List(                                                
                Condition(10, "supervisor"), 
                Condition(100, "manager") , 
                Condition(1000, "director") 
                )

def whoToNotify(price: Int) = {
        list.filter(_.price <= price).map(_.designation)
}     
案例类别条件(价格:整数,名称:字符串)
val list=列表(
条件(10,“监管人”),
条件(100,“经理”),
条件(1000,“董事”)
)
def whoToNotify(价格:整数)={

list.filter(uu.price)我认为这符合我的需要。我希望有一种解决方案可以神奇地用非常简洁和表达性强的代码解决问题。你可以用
一些
代替
列表
,但前提是你只需要精确地为每个类别包含零或一个项目从Scala 2.10开始,使用。
flatte
将不再适用于上述示例:
case class Condition(price: Int, designation: String)

val list = List(                                                
                Condition(10, "supervisor"), 
                Condition(100, "manager") , 
                Condition(1000, "director") 
                )

def whoToNotify(price: Int) = {
        list.filter(_.price <= price).map(_.designation)
}