以下是一些数据:
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)))
。
还有其他想法吗? (显然,我的实际用例比仅添加一些数字要复杂得多,所以我不是在寻找与intersect
或sum
函数关系过密的答案。)
答案 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