scala – 将参数列表应用于函数列表
发布时间:2020-12-16 09:54:52 所属栏目:安全 来源:网络整理
导读:我有一个参数列表,如List(1,2,3,“abc”,“c”)和一组函数,它们验证列表中存在的数据,如isNumberEven,isAValidString等. 目前,我获取列表的每个值并应用适当的函数来验证数据,如isNumberEven(params(0)).这导致了大而乱的代码,这在思考中是必不可少的. 我期
我有一个参数列表,如List(1,2,3,“abc”,“c”)和一组函数,它们验证列表中存在的数据,如isNumberEven,isAValidString等.
目前,我获取列表的每个值并应用适当的函数来验证数据,如isNumberEven(params(0)).这导致了大而乱的代码,这在思考中是必不可少的. 我期待在Scala中做这样的事情应该是可能的 – List(1,"abc","c").zip(List(fuctions)).foreach{ x => x._2(x._1)} 但是,这无法给出类型不匹配的运行时异常:
我在Function traits上尝试了模式匹配,但由于类型擦除而失败. 任何指针将被理解,如何解决这个问题. 解决方法
非常天真和不可扩展的实现,我对类型不是很好,当然有更好的方法:
val c = List(1,"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,"c") c: List[Any] = List(1,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,false,false) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |