我有以下地图Map(FULL -> 3854.0, REMAINING -> 3769.0)
我想计算两个值,使得(FULL / REMAINING)* 100
有一个很好的方法来做到这一点?我试过m.foldLeft(0)(_/_._2)
但是编译器抱怨float和Int之间的类型不匹配?
答案 0 :(得分:4)
您可以通过将0.0
指定为foldLeft
的第一个参数来修复类型不匹配,但这不会使您的代码正确。然后它将计算0.0/3854.0/3769.0
等于0.0
。
事实上,Map(FULL -> 3854.0, REMAINING -> 3769.0)
并不保证会被订购,因此我非常确定您能做的最好的事情是m('FULL') / m('REMAINING')
。
也许您想为此创建一个case class
,在这种情况下,您可以只说m.full/m.remaining
,甚至可以创建一个自动计算的方法。
答案 1 :(得分:1)
使用Map,无法保证这两个值确实存在。因此,您可能想要为Ken Bloom已经建议的那样创建一个类,或者使用get
Map
方法创建一个类,该方法返回Option[B]
:
val resOpt = for {
full <- m.get("FULL")
remainig <- m.get("REMAINING")
} yield (full / remaining) * 100
resOpt.getOrElse(someDefaultValue)
这样可以避免讨厌的运行时错误。