-1

Here's some data:

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

I would like to write a function filteredSum which supports the following:

/*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

There are a couple close misses; for instance * notation supports the first three calls:

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

And options give you the fourth:

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

But with this implementation the first three calls look a lot clunkier: filteredSum(data, Some(Seq(1))), for instance.

Any other ideas? (Obviously my actual use case is much more complicated than just adding some numbers together, so I'm not looking for answers that are too closely tied to the intersect or sum functions.)

Paul Siegel
  • 1,401
  • 13
  • 36

1 Answers1

1

Make two functions:

 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
Dima
  • 39,570
  • 6
  • 44
  • 70