我的等参数的列表List(1,2,3,"abc","c")和一组功能这验证了本数据列表中的一样isNumberEven,isAValidString等
目前,我取列表的每个值并应用适当的函数来验证数据,如isNumberEven(params(0)).这导致了大而乱的代码,这在思考中是必不可少的.
我期待在Scala中做这样的事情应该是可能的 -
List(1,2,3,"abc","c").zip(List(fuctions)).foreach{ x => x._2(x._1)}
Run Code Online (Sandbox Code Playgroud)
但是,这无法给出类型不匹配的运行时异常:
错误:类型不匹配; found:需要x._1.type(底层类型为Any):Int with String
我在Function traits上尝试了模式匹配,但由于类型擦除而失败.
任何指针将被理解,如何解决这个问题.
非常幼稚且不可扩展的实现,我不太擅长类型,当然有更好的方法:
val c = List(1,2,3,"abc","c")
def isEven(x: Int) = if(x % 2 == 0) true else false
def isUpperCase(x: String) = if(x.head.isUpper) true else false
c.map {
case x: Int => isEven(x)
case x: String => isUpperCase(x)
case _ => false
}
Run Code Online (Sandbox Code Playgroud)
您还可以定义函数列表:
scala> val c = List(1,2,3,"abc","c")
c: List[Any] = List(1, 2, 3, abc, c)
scala> def isEven(x: Int) = if(x % 2 == 0) true else false
isEven: (x: Int)Boolean
scala> def isOdd(x: Int) = !isEven(x)
isOdd: (x: Int)Boolean
scala> def isUpperCase(x: String) = if(x.head.isUpper) true else false
isUpperCase: (x: String)Boolean
scala> def someString(x: String) = true
someString: (x: String)Boolean
scala> val ints = List(isEven(_), isOdd(_))
ints: List[Int => Boolean] = List(<function1>, <function1>)
scala> val strings = List(isUpperCase(_), someString(_))
strings: List[String => Boolean] = List(<function1>, <function1>)
scala> c.map {
| case x: Int => ints.map(f => f(x)).exists(f => f(x))
| case x: String => strings.map(f => f(x)).forall(f => f(x))
| case _ => false
| }
res2: List[Boolean] = List(true, true, true, false, false)
Run Code Online (Sandbox Code Playgroud)