Seq.zipWithIndex使用方法

本文介绍了Scala中Seq操作的使用方法,特别是如何利用zipWithIndex方法为Seq中的元素添加索引,便于进一步的数据处理。通过具体示例展示了如何遍历带有索引的Seq,并输出每个元素及其对应的索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个主要是能给目前已有的Seq加上一个索引序号,它的返回值还是一个Seq

A new sequence containing pairs consisting of all elements of 
this sequence paired with their index. Indices start at 0.

例子

List("a", "b", "c").zipWithIndex = List(("a", 0), ("b", 1), ("c", 2))
val itemsCosts = Seq(("Pencil", 0.52), ("Paper", 1.35), ("Notebook", 2.43))
val itemsCostsIndices = itemsCosts.zipWithIndex
for(itemsCostsIndex<-itemsCostsIndices) {
  itemsCostsIndex match {
    case ((item, price), index) => println(s"$index:the $item is $price")
  }
}

输出

0:the Pencil is 0.52
1:the Paper is 1.35
2:the Notebook is 2.43


转载于:https://my.oschina.net/sucre/blog/656985

### Scala 中 `mutable.Buffer` 和 Lambda 表达式的捕值行为 在 Scala 编程语言中,`scala.collection.mutable.Buffer` 是一种可变集合类型,允许动态调整大小并支持高效的随机访问和更新操作[^1]。 当在一个循环结构内部定义 lambda 表达式时,如果该匿名函数引用了外部作用域中的变量,则会涉及到闭包的概念。对于像 Java 或 C# 这样的某些编程语言来说,在 foreach 循环里使用的局部变量会被隐式地视为 final (不可改变),而在 Scala 中情况有所不同——它能够捕捉到循环迭代器所指向的实际对象而非每次迭代创建的新副本。这意味着如果你在循环体内修改了一个被多个 lambda 捕获的共享变量,那么这些变化会影响到所有已经创建好的 lambda 函数实例[^2]。 考虑下面这个例子来说明这个问题: ```scala import scala.collection.mutable.{Buffer, ArrayBuffer} val buffer = new ArrayBuffer[Int]() for(i <- 0 until 3){ val f = () => println(i) buffer += i } buffer.foreach(f => f()) ``` 上述代码将会打印三次数字 '3' 而不是预期中的 0、1、2。这是因为所有的 lambda 都捕获到了同一个变量 `i` 的最终值而不是各自独立保存当时的状态。为了实现按次序输出的效果,可以采用立即执行的方式或者引入额外的作用域以确保每个 lambda 获取的是不同的绑定: 改进后的版本如下所示: ```scala import scala.collection.mutable.ArrayBuffer val improvedBuffer = new ArrayBuffer[(Int) => Unit]() for (j <- 0 until 3) { val currentJ = j // 创建一个新的局部变量用于当前迭代 val g = (index: Int) => println(s"${currentJ}") improvedBuffer += ((_: Int) => g(index)) } improvedBuffer.zipWithIndex.foreach { case (func, idx) => func(idx) } ``` 通过这种方式,每一个 lambda 将拥有自己的一份数据拷贝,从而避免了由于共同引用同一变量而导致的行为异常现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值