我想对Map("one" -> 2, "two" -> 3, "three" -> 4)的值2+3+4求和,当然我可以使用以下方法:

  • Map("one" -> 2, "two" -> 3, "three" -> 4).foldLeft(0)(_ + _._2)
  • Map("one" -> 2, "two" -> 3, "three" -> 4).values.sum()

  • 我发现Map具有另一个更直接的API总和:def sum: A,但是,我没有搜索有关此API的任何示例,如何使用它?

    最佳答案

    如您所见,对于sum[B >: (A, B)](implicit num: Numeric[B]): B,它需要implicit参数,并且参数类型是Numeric[B]类型。



    对于您的情况,类型为Map[String, Int],因此您需要为implicit方法的Numeric[(String, Int)]实现sum,例如:

     trait MyTupleNumeric extends Numeric[(String, Int)] {
        def plus(x: (String, Int), y: (String, Int)) = ("", x._2 + y._2)
    
        override def minus(x: (String, Int), y: (String, Int)): (String, Int) = ("", x._2 - x._2)
    
        override def times(x: (String, Int), y: (String, Int)): (String, Int) = ("", x._2 * y._2)
    
        override def negate(x: (String, Int)): (String, Int) = ("", -x._2)
    
        override def fromInt(x: Int): (String, Int) = ("", x)
    
        override def toInt(x: (String, Int)): Int = x._2
    
        override def toLong(x: (String, Int)): Long = x._2.toLong
    
        override def toFloat(x: (String, Int)): Float = x._2.toFloat
    
        override def toDouble(x: (String, Int)): Double = x._2.toDouble
    
        override def compare(x: (String, Int), y: (String, Int)): Int = x._2 - y._2
      }
    
      implicit object MyTupleNumericImplicit extends MyTupleNumeric
    
      val f = implicitly[Numeric[(String, Int)]] // implicitly is used find implicits base on the type
      println(f.plus(("one", 2), ("two", 3)))
      val r = Map("one" -> 2, "two" -> 3, "three" -> 4)
      println(r.sum._2)
      println(r.sum(MyTupleNumericImplicit))
    

    作为上述代码,我们使用Numeric实现了自己的(String, Int)类型,并实现了方法。

    然后我们将implicit纳入我们的范围,因此我们可以使用implicitly来获取function并进行调用。

    而且sum方法也可以找到implicitNumeric[(String, Int)]参数

    09-05 19:58