如何在不使用recurrsion或var

时间:2017-11-16 15:46:59

标签: scala

我想在地图中添加所有值,而不使用var或任何可变结构。我试图做这样的事情,但它确实有效:

val mymap = ("a" -> 1, "b" -> 2)
    val sum_of_alcohol_consumption = 
    for ((k,v) <- mymap ) yield (sum_of_alcohol_consumption += v)

我被告知我可以在列表中使用.sum 请帮忙

由于

3 个答案:

答案 0 :(得分:4)

您可以使用Map的.values函数返回其值的Iterable List(所有整数),然后在其上调用.sum函数:

val myMap = Map("a" -> 1, "b" -> 2)
val sum = myMap.values.sum
println(sum) // Outputs: 3

答案 1 :(得分:1)

更优雅地使用sum的等效答案是使用fold操作。 sum的实现方式与此类似:

val myMap = Map("a" -> 1, "b" -> 2)
val sumAlcoholConsumption = myMap.values.foldLeft(0)(_ + _)

values仅返回地图中值的序列。第一个foldLeft参数是操作的零值(将其视为累加器值的初始值)。第二个参数是一个函数,它将累加器的当前值添加到当前元素,返回两个值的总和 - 并依次应用于每个值。也就是说,sum更方便。

答案 2 :(得分:0)

为了获得map的唯一值,它提供了一个将返回iterable的函数值,我们可以直接将sum函数应用于它。

scala> val mymap = Map("a" -> 1, "b" -> 2)
mymap: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)

scala> mymap.values.sum
res7: Int = 3