Scala 如何缩放此块:
这里是Scala新手。。。 如何缩放此块:Scala 如何缩放此块:,scala,Scala,这里是Scala新手。。。 如何缩放此块: if(sess != null) { sess.any = params.get("any").getOrElse("") sess.name = params.get("name").getOrElse("") sess.entity = params.get("entity").getOrElse("") sess.tin = params.get("tin").getOrElse("") sess.tintype = para
if(sess != null) {
sess.any = params.get("any").getOrElse("")
sess.name = params.get("name").getOrElse("")
sess.entity = params.get("entity").getOrElse("")
sess.tin = params.get("tin").getOrElse("")
sess.tintype = params.get("tintype").getOrElse("")
sess.bdate = params.get("bdate").getOrElse("")
sess.addr = params.get("addr").getOrElse("")
sess.city = params.get("city").getOrElse("")
sess.state = params.get("state").getOrElse("")
sess.zip = params.get("zip").getOrElse("")
}
sess只是case类的一个实例。您通常不会使sess可变,但这里最简单的解决方案是取出可移动的公共代码。通常不能按名称查找和设置字段,因此
sess.x=
部分必须保留,而case类没有与其字段名称匹配的字符串,因此“x”
必须保留。这样就剩下了
if (sess != null) {
def get(s: String) = params.get(s).getOrElse("")
sess.any = get("any")
/* ... */
sess.zip = get("zip")
}
仍然有很多样板,但可能比用反射来解决问题更好,而且肯定是一种改进。
在这种情况下,您可能需要考虑一个<强>键值映射被封装到一个简单的类中。 通过这种方式,您可以编写自定义方法来添加/删除/检查元素,这类似于访问case类 如果希望键具有类型安全性,则贴图的键可以是扩展常见特征的对象,如:trait MyKey
object AnyKey extends MyKey
object NameKey extends MyKey
MyKey
还可以有一个字符串,在填充映射时调用params.get()方法时可以使用该字符串
然后,您可以将所有键放入一个列表[MyKey]
,并在列表上进行foreach操作以填充地图
如果您需要在这个包装类上进行模式匹配,那么您可以使用。使用。首先假设sess的缩写版本为sess
case class sess(val any: String, val name: String, val entity: String)
val mySess = sess.tupled(argsTupled)
以及其成员名称列表(本问题中的参数)
或者举个例子
val args = "any,name,entity".split(",").toList
如前所述,定义获取可能参数值的get
方法
implicit class parameterGetter( val parameters: Map[String,String]) extends AnyVal {
def get(s: String) = parameters.get(s).getOrElse("")
}
假设问题中的params
是一个Map[String,String]
然后为每个参数获取一个值
val argsVals = args.map { a => params.get(a).get }
然后对结果进行二元组运算
import shapeless._
import HList._
import syntax.std.traversable._
// Especially useful if case class includes different types
val argsH = argsVals.toHList[String::String::String::HNil]
val argsTupled = argsH.get.tupled
对于case类,例如
case class sees2(val city: String, val x: Int, val y: Int)
在toHList
中键入的内容将改为String::Int::Int::HNil
最后,创建一个sess
的实例
case class sess(val any: String, val name: String, val entity: String)
val mySess = sess.tupled(argsTupled)
通过从myess
mySess.any
mySess.name
mySess.entity
也许你会在这里得到答案,但你在这里可能会有更好的运气