我有一个像List(1,2,3,"abc","c")这样的参数列表和一组函数来验证列表中存在的数据,例如isNumberEvenisAValidString等。

当前,我获取列表的每个值并应用适当的函数来验证数据,例如isNumberEven(params(0))。这导致了代码大而凌乱,这在思考中是绝对必要的。

我希望应该可以在Scala中做这样的事情-

List(1,2,3,"abc","c").zip(List(fuctions)).foreach{ x => x._2(x._1)}

但是,这会导致类型不匹配的运行时异常而失败:



我尝试对功能特征进行模式匹配,但由于类型擦除而失败。

任何指针将不胜感激,因为这将如何解决。

最佳答案

非常幼稚且不可扩展的实现,我对类型不是很好,肯定有更好的方法:

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
}

您还可以定义功能列表:
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)

关于scala - 将参数列表应用于功能列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25385622/

10-11 22:25
查看更多