首页 > 解决方案 > 如何在scala中解析地图列表

问题描述

我正在尝试从如下配置的 Map 列表中检索值。

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

标签: scala

解决方案


好吧,伙计,这些是你在那里得到的一些混乱的配置,你应该尝试输出一个更好的类型,但是你可以做这样的事情:

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 

推荐阅读