我想对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
方法也可以找到implicit
的Numeric[(String, Int)]
参数