Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在scala中解析映射列表_Scala - Fatal编程技术网

如何在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