加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

是否可以使用’yield’来生成’Iterator’而不是Scala中的列表?

发布时间:2020-12-16 09:47:22 所属栏目:安全 来源:网络整理
导读:是否可以使用yield作为迭代器,而不评估每个值? 这是一个常见的任务,当它很容易实现复杂的列表生成,然后你需要将其转换为Iterator,因为你不需要一些结果… 解决方法 当然。实际上,有三个非严格性的选项,我在下面列出。对于示例,假设: val list = Lis
是否可以使用yield作为迭代器,而不评估每个值?

这是一个常见的任务,当它很容易实现复杂的列表生成,然后你需要将其转换为Iterator,因为你不需要一些结果…

解决方法

当然。实际上,有三个非严格性的选项,我在下面列出。对于示例,假设:

val list = List.range(1,10)
def compute(n: Int) = {
    println("Computing "+n)
    n * 2
}

>流。流是一个延迟评估的列表。它将根据需要计算值,但是一旦它们被计算,它不会重新计算值。如果你要多次使用流的部分,这是最有用的。例如,运行下面的代码将打印“计算1”,“计算2”和“计算3”,每次一次。

val stream = for (n <- list.toStream) yield compute(n)
val third = stream(2)
println("%d %d" format (third,stream(2)))

> A视图。视图是基本集合上的操作的组合。在检查视图时,根据需要计算检查的每个元素。这是最有用的,如果你将随机访问视图,但永远不会看起来,但它的一小部分。例如,运行下面的代码将打印“Computing 3”两次,没有别的(除了结果)。

val view = for (n <- list.view) yield compute(n)
val third = view(2)
println("%d %d" format (third,view(2)))

>迭代器。迭代器是用来懒洋洋地遍历集合的东西。人们可以认为它是一个“一次性”的集合,可以这么说。它不会重新计算或存储任何元素 – 一旦元素已经“计算”,它不能再次使用。这是一个有点更棘手的使用,因为,但它是最有效的一个给定这些约束。例如,以下示例需要不同,因为Iterator不支持索引访问(并且如果以这种方式写入视图将执行得很糟),并且下面的代码打印“计算1”,“计算2”,“计算3” “计算4”,“计算5”和“计算6”。此外,它在最后打印两个不同的数字。

val iterator = for (n <- list.iterator) yield compute(n)
val third = iterator.drop(2).next
println("%d %d" format (third,iterator.drop(2).next))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读