当前位置: 首页 > 知识库问答 >
问题:

Scala的可变集合上的视图有什么懒惰的?

阎昌勋
2023-03-14

我认为这个问题本质上是关于可变性背景下的懒惰是什么。

在Scala编程(或文档)中,他们给出了如何在不可变和可变集合上使用视图的示例。在该节中,它们指出

val arr = (0 to 9).toArray
val subarr = arr.view.slice(3, 6)

视图并不复制这些元素,它只是提供对它们的引用。

def negate(xs: collection.mutable.Seq[Int]) = 
  for (i <- 0 until xs.length) xs(i) = - xs(i)

negate(subarr)
arr  // Array(0, 1, 2, -3, -4, -5, 6, 7, 8, 9)

我明白为什么我们会得到那个答案。但是transformer切片有什么懒惰的呢?我把懒惰理解为只在需要时才计算值(就像不可变集合的例子一样)。但是,slice中的值从不计算,它们只是对arr中的值的引用,即使在调用negate之后也是如此。这是我对懒惰的误解吗?还是医生们在以另一种方式使用懒惰?还是别的什么?

共有1个答案

漆雕嘉平
2023-03-14

下面是这种懒惰行为的一个更好的例子:

val a = Array(1,2,3)
val b = a.map(_ + 5)
val c = a.view.map(_ + 5)
println(b(1)) //prints 7
println(c(1)) // prints 7

a(1) = 5

println(b(1)) // still prints 7, since that array was computed on instantiation
println(c(1)) // now prints 10, since elements of c are lazily evaluated each time.
 类似资料:
  • 我正在尝试使用实体图来触发加载的惰性集合,但不幸的是,实体图也会触发所有嵌套集合。我正在使用spring-data-jpa-entity-graph库在运行时创建实体图。 带有 JPA 存储库的 Spring 服务: 在这种情况下,服务还为每辆车返回零件收集,但我只想获取每个品牌的车辆收藏的品牌列表。 我们如何在第一级触发加载懒惰集合(仅限品牌车辆-没有车辆零件)?

  • 问题内容: 我有的: 有什么问题: 问题是,在会话关闭后,我无法拉动惰性收集。但是我也无法在 proceed 方法中关闭会话。 什么解决方案(粗略解决方案): a)在会话关闭之前,强制hibernate以拉动惰性集合 .... b)也许更轻松的方法是使用注释 题: 什么是最佳做法/常见方式/更轻松的方式?意味着将我的对象转换为JSON。 问题答案: 在内部使用初始化惰性对象。 现在,在Transa

  • 问题内容: 在使用Guava集合并阅读其文档时,我已经阅读了几次“术语 视图” 。 我一直在寻找一种解释,说明在这种情况下视图是什么以及它是否在Guava之外使用。在这里经常使用。番石榴的这种类型在其名称中具有 视图 。 我的猜测是,一个集合的视图是另一个具有相同数据但结构不同的集合。例如,当我将条目从a添加到后者时,将是前者的视图。那是对的吗? 有人可以给我链接到一个公认的 view 定义(如果

  • 我有模型类别。它可能有父类别和子类别列表。我写这个问题是因为找不到实体和自己相关的情况。 我试图这样实现它: 我保存实体,如: 我希望看到这样的情况: 但是在子模型中,我有递归循环。如何防止它? 是的,我也使用了@JsonIgnore。但是我不确定这是不是一个好的做法。但是如果我有一个案例,当我需要一个类别时,我真的需要将它发送给父母的UI。@JsonIgnore可以产生这个吗?

  • 我试图运行一个简单的字数计数程序与和得到一个例外。 异常线程"main"java.lang.BootstrapMultiodError:java.lang.NoClassDefFoundError: scala/集合/可变/ArraySeq$ofRef at SparkWordCount$. main(SparkWordCount.scala:18) 从第18行开始的代码是 我的环境: Windo

  • 我正在为列表视图编写一个lazyload代码,在这个代码中,我得到了一个json格式的文本和图像url,并将它们放在列表视图中。 图像和文字都相应地显示为我想要的。 我面临的问题是,当列表向下或向上滚动时,视图的索引会受到干扰。 假设我的列表中有10个元素,图像可以横向预览。最初,我可以看到4个元素的onclick操作运行良好,但当我向下滚动并单击第7个元素时,索引会受到干扰,并导致空指针异常。