Scala 中视图的使用

Use of View in Scala

我正在解决问题过滤列表中的位置:(对于给定的整数列表,return一个新列表删除奇数位置的元素)

我想出了

arr.zipWithIndex.filter(_._2 %2 == 1).map(_._1)

但是有人建议下面的代码会更快

arr.view.zipWithIndex.filter{ _._2 % 2 != 0 }.map { _._1}.force.toList

我知道,View 创建了无条件集合(懒惰求值),但是 在哪一步(方法调用)它会帮助我们。 含义:

arr.view,创建 zipWithIndex 将在其上工作的视图,zipWithIndex 将处理每个元素以创建值和索引的映射。我想到现在为止,没有优化。

filter 方法必须对每个元素都起作用,然后它才能跳过或 select 它。 我不确定,在这种情况下添加视图会有什么帮助。

使用view意味着所有的操作都可以一次发生,而不是一次发生一个。

arr.zipWithIndex.filter(_._2 %2 == 1).map(_._1)

这有效,但它会在此过程中创建 3 个新列表,首先它会运行 zipWithIndex 生成一个包含结果的新列表。然后将新列表传递给 filter,创建另一个列表,最后在该列表上调用 map 生成最终列表。

所以我们创建了两个我们并不真正需要的中间列表。

arr.view.zipWithIndex.filter{ _._2 % 2 != 0 }.map { _._1}.force.toList

此版本使用 view,因此可以一次性执行所有这些操作,而无需在每个步骤中创建那些中间集合。