如何在scala中解析映射列表
我试图从如下配置的映射列表中检索值如何在scala中解析映射列表,scala,Scala,我试图从如下配置的映射列表中检索值 val tabColMapping = List( Map("table" ->"Emp") -> Map("keyCol" -> "EmpId", "orderingCol" -> "dob"), Map("table" -> "Dept") -> Map("keyCol" -> "deptId", "orderingCol" -> "branch")) 尝
val tabColMapping = List( Map("table" ->"Emp") -> Map("keyCol" -> "EmpId", "orderingCol" -> "dob"),
Map("table" -> "Dept") -> Map("keyCol" -> "deptId", "orderingCol" -> "branch"))
尝试为每个输入表名获取两个不同变量中的keyCol和orderingCol值。
所以如果我进入EMP,它会给我
val kc = EmpId
val oc = dob
这些都是一些混乱的配置,伙计,你应该尝试输出一个更好的类型,但是你可以这样做:
def getMessyConfigs(input: String): List[Option[(String, String)]] = tabColMapping.map(
mapsTuple =>
if (mapsTuple._1.values.toList.contains(input)) {
//I guess this config names never change
val maybeKC: Option[String] = mapsTuple._2.get("keyCol")
val maybeOC: Option[String] = mapsTuple._2.get("orderingCol")
// This will retrieve if both exist otherwise will return None
for {
kc <- maybeKC
oc <- maybeOC
} yield {
(kc, oc)
}
} else None
)
println(getMessyConfigs("Emp"))// this will output a List[Option(String, String)]], you can add the .headOption.flatten at the end of the function if you prefer ( and if you only expect one)
// If you feel brave enough you can do a get, but I don't recommend
val (kc, oc): (String, String) = getMessyConfigs("Emp").headOption.flatten.get
另一种方法 键是参数化的,因此可以使用必要的键
println(getNestedConfig(tabColMapping, "Dept", "keyCol"))
def getNestedConfig(ip: List[(Map[String, String], Map[String, String])], parentKey: String, childKey: String): Option[String] = {
val pk = ip.filter(i => i._1.toList.filter(i1 => i1._2 == parentKey).size > 0)
if (pk.isEmpty)
None
else
pk.head._2.get(childKey)
}
什么类型,地图的元组列表?@PedroCorreiaLuís,它是地图的元组。。不确定我是否理解正确。@Predro Correia Luis这很好用。。但是,如果我可以自由更改配置,那么您如何建议结构map.val tabColMapping=MaptableName->Emp,keyCol->EmpId,orderingCol->dob,MaptableName->Dept,keyCol->deptId,orderingCol->branch如果我这样做输入字符串,它会有帮助吗,但是为了更好地构建您的配置,我必须知道更多,例如,这些配置是静态的吗?您可以同时拥有多个配置吗?您是否有或预计将来会有更多的病例?这些配置的目的是什么?这更像是静态的,如果添加了任何新密钥,那么它将跨越列表中的所有映射。这种配置的目的是为下游获取必要的键列。例如,当我将emp作为表名传递时,我希望收集该表的所有键列,以便在转换需要时使用这些键列。我希望这能有所帮助。如果它是一个完全静态的东西,那么你可以有一个配置列表,然后你可以调用config 1->values,如果你可以轻松地操作这些值,我会这样做:case-class-config-keyCol:String,orderingCol:String-val-configEmp=ConfigkeyCol=EmpId,orderingCol=dob val configDept=ConfigkeyCol=deptId,orderingCol=branch val configMore=Config???,???val configs=listconfigmp、configDept、configMore