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

这里是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 = 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

也许你会在这里得到答案,但你在这里可能会有更好的运气