如何使用Scala中的Map和Functions减少Tuple4的冗长

时间:2017-06-25 04:01:11

标签: scala tuples

我有ListMap Tuple4作为值:

val dbCons = ListMap (
    "con1" -> ("str 1", "str 2", "str 3", true)
    // etc.
)

/*line A*/def testAllCon(map: ListMap[String, Tuple4[String,String, String, Boolean]]): Unit = {
  map.keySet.foreach{ key =>
    val prop = map.get(key).get
    /*line B*/val dbSchema = DbSchema(prop._1, prop._2, prop._3, prop._4)      
  }

如何在“A线”进行声明,如果可能的话,在“B线”使用,更简洁。

我查了一个类似的问题here,请直接。

2 个答案:

答案 0 :(得分:1)

您可以为4元组定义type alias。我在这里的例子中称它为Record,但您可能想给它一个更具描述性的名称。

此外,对于“B行”,您可以将该函数定义为模式匹配:

type Record = (String, String, String, Boolean)

val dbCons = ListMap (
    "con1" -> ("str 1", "str 2", "str 3", true)
    // etc.
)

// With the for-comprehension syntax
/*line A*/def testAllCon(map: ListMap[String, Record]): Unit = {
  for ((key, (s1, s2, s3, b)) <- map) {
    /*line B*/val dbSchema = DbSchema(s1, s2, s3, b)      
  }
}

// Without for-comprehension syntax
/*line A*/def testAllCon(map: ListMap[String, Record]): Unit = {
  map.foreach {
    case (key, (s1, s2, s3, b)) =>
      /*line B*/val dbSchema = DbSchema(s1, s2, s3, b)      
  }
}

答案 1 :(得分:1)

正如@JackLeow指出的那样,您可以使用类型别名为元组创建一个较短的引用。

testAllCon()方法也可以缩短。

def testAllCon(map: ListMap[String, Record]): Unit =
  map.values.foreach{ prop =>
    val dbSchema = DbSchema.apply _ tupled prop
  }