Scala:可选的参数序列

Scala: optional sequence of arguments

这是一些数据:

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 函数关系过于密切的答案。)

做两个函数:

 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