Scala:可选的参数序列

时间:2017-12-23 13:53:18

标签: scala scala-option

以下是一些数据:

val data = List(1,1,2,2,3)

我想编写一个支持以下内容的函数filteredSum

/*1*/ filteredSum(data) // Outputs 0
/*2*/ filteredSum(data, 1) // Outputs 1 + 1 = 2
/*3*/ filteredSum(data, 1, 3) // Outputs 1 + 1 + 3 = 5
/*4*/ filteredSum(data, None) // Outputs 1 + 1 + 2 + 2 + 3 = 9

有几次失误;例如*表示法支持前三个调用:

def filteredSum(data: Seq[Int], filterValues: Int*): Int = {
  data.intersect(filterValues).sum
}

选项会给你第四个:

def filteredSum(data: Seq[Int], filterValues: Option[Seq[Int]]) : Int = {
  if(filterValues.nonempty) data.intersect(filterValues.get).sum
  else data.sum
}

但是通过这个实现,前三个调用看起来很笨拙:例如filteredSum(data, Some(Seq(1)))

还有其他想法吗? (显然,我的实际用例比仅添加一些数字要复杂得多,所以我不是在寻找与intersectsum函数关系过密的答案。)

1 个答案:

答案 0 :(得分:1)

制作两个功能:

 def filteredSum(data: Seq[Int], filterValues: Int*): Int =  
   data.filter(filterValues.toSet).sum


 def filteredSum(data: Seq[Int], all: Boolean) : Int = 
   if(all) data.sum else 0