I'm having trouble to implement the following requirement in a functional way in scala. Given a predefined number of boolean flags, I want to build up a collection of numbers. For each (true) flag, a hardcoded number should be included in the collection.
This is the unsatifying solution I have so far:
def createCodeArray(flagA:Boolean, flagB:Boolean, flagC:Boolean): Seq[Int] = {
val codes = ListBuffer.empty[Int]
if(flagA) codes += 2
if(flagB) codes += 7
if(flagC) codes += 12
return codes
}
I'm trying to achieve to same with pattern matching, but I don't want to list all the possible combinations. Also, I'd like to avoid mutable data-structures.
Any suggestion on how to write this in a functional way is much appreciated
-
1\$\begingroup\$ Could you tell us more about where these flags come from, how this method is called, and how the resulting list will be used? \$\endgroup\$200_success– 200_success2017年05月19日 12:49:07 +00:00Commented May 19, 2017 at 12:49
-
\$\begingroup\$ @200_success this should not matter for this question, the method's functionality and signature should just remain as it is \$\endgroup\$Raphael Roth– Raphael Roth2017年05月19日 18:43:32 +00:00Commented May 19, 2017 at 18:43
1 Answer 1
You could use tuples to pair your flags with an Int
. Throw those into a Seq
and then perform a filter
and then a map
on that Seq
. Here is how that would look:
def f(a: Boolean, b: Boolean, c: Boolean): Seq[Int] = {
val xs = Seq((a, 2), (b, 7), (c, 12))
xs.filter(t => t._1).map(t => t._2)
}
Note that in Scala you don't need to use a return
statement as long as the last bit of code in your function returns a new value.
-
\$\begingroup\$ @thanks, I'm aware that the return statement is not needed, still I'd like to use it to make the code more "speaking" \$\endgroup\$Raphael Roth– Raphael Roth2017年05月19日 18:44:32 +00:00Commented May 19, 2017 at 18:44
-
1