Scala - 地图上的图案头/尾

时间:2016-12-07 18:51:14

标签: scala

我试图制作尾递归方法,但我使用Map并且我不知道如何使用模式匹配来检查Map是否为空/ null并获得头/尾:

def aa(a:Map[String, Seq[Operation]]): Map[String, (Seq[Operation], Double)] = {

    def aaRec(xx:Map[String, Seq[Operation]],
              res:Map[String, (Seq[Operation], Double)],
              acc:Double = 0): Map[String, (Seq[Operation], Double)] = xx match {
      case ? => 
        res
      case _ => 
        val head = xx.head
        val balance = head._2.foldLeft(acc)(_ + _.amount)
        aaRec(xx.tail, res + (head._1 -> (head._2, balance)), balance)
    }

    aaRec(a, Map[String, (Seq[Operation], Double)]())

    }
}

case empty map和case h :: t是什么语法正确?

提前感谢

2 个答案:

答案 0 :(得分:6)

Map没有订单,因此没有headtail。它也没有unapply/unapplySeq方法,因此您无法在Map上进行模式匹配。

我认为使用foldLeft可能是您的最佳选择。

答案 1 :(得分:3)

我不确定是否可以在地图上进行模式匹配,但可以使用基本的组合方法重写此代码:

def aa(a:Map[String, Seq[Operation]]): Map[String, (Seq[Operation], Double)] =
  a.mapValues(seq => (seq, seq.map(_.amount).sum))