2014-09-29 89 views
0

使用此代码:斯卡拉返回类型missmatch

val kv: HashMap[Int, Double] = HashMap[Int, Double]() 
val temp = valuesList.list.foreach { (id: Int, value: Option[Double]) => 
    val kvValue: Double = kv.getOrElse(id, 0) 
    val nvValue: Double = value.getOrElse(0) 
    val nv = kvValue + nvValue 
    kv.put(id, nv) 
} 

我得到这个错误:

type mismatch; 
found : (Int, Option[Double]) => Option[Double] 
required: ((Int, Option[Double])) => ? 

似乎无法找到解决办法......

+1

如果声明为空,试图使用'kv'有什么意义? 'getOrElse'将始终返回参数中的内容,因为它是空的 – 2014-09-29 07:27:30

+1

@ElectricCoffee这只是一个例子吗?但更习惯的是:'val kv = mutable.Map [Int,Double]()'或'val kv = mutable.HashMap.empty [Int,Double]' – 2014-09-29 16:43:51

+1

@ som-snytt更习惯于不使用可变数据并且使用'map'而不是'foreach'来构建一个集合而不是改变其中的一个 – 2014-09-29 17:19:04

回答

1

我猜你给的你的函数的类型错误。

valuesList可能是一个元组列表。那就是List[(Int, Option[Double])]

所以foreach给你的匿名函数,而不是IntOption

一个快速解决方案是使用case来构造一个部分函数,​​它推动编译器为你解开元组。

import scala.collection.mutable.HashMap 

val kv: HashMap[Int, Double] = HashMap[Int, Double]() 
val valuesList = List(1-> Option(1.0)) 

val temp = valuesList foreach { 
    case (id: Int, value: Option[Double]) => 
    val kvValue: Double = kv.getOrElse(id, 0) 
    val nvValue: Double = value.getOrElse(0) 
    val nv = kvValue + nvValue 
    kv.put(id, nv) 
} 

println(kv) 
// gives Map(1 -> 1.0) 

确定我在这里更改了valuesList

+0

如果您不熟悉部分功能,这是一篇很好的文章。(http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html) – 2014-09-29 05:13:27

+0

可变数据一般虽然被认为是不好的做法 – 2014-09-29 07:56:45