我有以下功能来计算平均价格:
def averagePrice(es: Stream[Order], t: Ric) = {
val fes = es.filter(executions(_,t))
if(fes.isEmpty) 0.0
else fes.map(o => o.quantity * o.price).sum / fes.map(o => o.quantity).sum
}
正如您所看到的,else
条件必须经过两次流:一次获得总费用,一次获得总费用。有没有办法通过流一次来计算平均价格?
答案 0 :(得分:7)
迭代过流并同时收集价格和数量:
val (t, q) = fes.foldLeft((0,0)){
(total, item) => (total._1 + item.quantity*item.price, total._2 + item.quantity)
}
答案 1 :(得分:3)
您可以计算平均值"即时"
def averagePrice(es: Stream[Order], t: Ric): Double =
val fes = es.filter(executions(_, t))
fes.foldLeft((0, 0.0)) { case ((i, avg), o) =>
(i + 1, avg + (o.price * o.quantity - avg) / (i + 1))
}._2