给出以下代码:
def findMinOpt(li: List[Option[Int]]): Option[Int] =
{
val listwithoutOptions = li.flatten
listwithoutOptions.reduceLeftOption(_ min _)
}
它会过滤掉所有选项,有效地创建一个新列表,然后返回最小值。
我在这段代码中看到的问题是它处理了一个列表两次但实际上比这更糟糕,因为创建了第二个未缓存的列表。是否有一种惯用的方法只处理一次列表?
可选问题:如何执行基准测试?通常操作系统使用缓存机制,因此在重复测试之间,我想清除缓存。有没有办法做到这一点?
答案 0 :(得分:2)
另一种可能的实现(没有列表重复):
def optMin(a: Option[Int], b: Option[Int]): Option[Int] =
(a, b) match {
case (Some(x), Some(y)) => Option( x min y)
case (sx, None) => sx
case (None, sy) => sy
case _ => None
}
li.reduceLeft { optMin(_, _) }
但是对于所有比较创建了Pair对象。
Imho这是代码表达和代码最优化的斗争。
答案 1 :(得分:1)
您可以使用view
来阻止创建中间列表
li.view.flatten.reduceLeftOption(_ min _)