0

给定以下代码:

def findMinOpt(li: List[Option[Int]]): Option[Int] =
    {
      val listwithoutOptions = li.flatten
      listwithoutOptions.reduceLeftOption(_ min _)
    }

它过滤掉所有选项,有效地创建一个新列表,然后返回最小值。

我在这段代码中看到的问题是它两次处理一个列表,但实际上比创建第二个未缓存的列表更糟糕。是否有一种只处理一次列表的惯用方式?

可选问题:如何执行基准测试?通常操作系统使用缓存机制,所以在重复测试之间我想清除缓存。有没有办法做到这一点?

4

2 回答 2

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 对象。

恕我直言,这是代码表达和代码最优性的斗争。

于 2013-11-10T10:15:57.567 回答
1

您可以使用view来防止创建中间列表

li.view.flatten.reduceLeftOption(_ min _)
于 2013-11-10T09:47:31.807 回答