`

Scala yield案例 (for 循环和 yield 的例子)

 
阅读更多
下面是摘自 《Programming in Scala》关于 yield 的解释:
For each iteration of your for loop, yield generates a value which will be remembered. It's like the for loop has a buffer you can't see, and for each iteration of your for loop, another item is added to that buffer. When your for loop finishes running, it will return this collection of all the yielded values. The type of the collection that is returned is the same type that you were iterating over, so a Map yields a Map, a List yields a List, and so on.

Also, note that the initial collection is not changed; the for/yield construct creates a new collection according to the algorithm you specify.


上面那段话的意义就是,for 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scala 中 for 循环是有返回值的。如果被循环的是 Map,返回的就是  Map,被循环的是 List,返回的就是 List,以此类推。

基于上面的信息,来看几个例子:
scala> for (i <- 1 to 5) yield i
res10: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)


前面的例子都不算什么,还只是个开始. 接下来, 对我们初始集合的每个元素做一次翻倍:
scala> for (i <- 1 to 5) yield i * 2
res11: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)


这里是 for/yield 循环的求模操作:
scala> for (i <- 1 to 5) yield i % 2
res12: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 0, 1, 0, 1)


Scala 数组上的 for 循环 yield 的例子

之前提到过 for 循环 yield 会构造并返回与给定集合相同类型的集合。为此,我们来看看以下用 Scala 数组上的例子。注意把 yield(我们可以把 yield 用作一个动词) 出来的集合类型与前面的几个例子对比:
scala> val a = Array(1, 2, 3, 4, 5)
a: Array[Int] = Array(1, 2, 3, 4, 5)
 
scala> for (e <- a) yield e
res5: Array[Int] = Array(1, 2, 3, 4, 5)
 
scala> for (e <- a) yield e * 2
res6: Array[Int] = Array(2, 4, 6, 8, 10)
 
scala> for (e <- a) yield e % 2
res7: Array[Int] = Array(1, 0, 1, 0, 1)


正如你所见, 例子中被 yield 的是 Array[Int], 而更早的例子中返回的类型是 IndexedSeq[Int].

for 循环, yield, 和守卫( guards) (for loop 'if' conditions)

假如你熟悉了 Scala 复杂的语法,你就会知道可以在 for 循环结构中加上 'if' 表达式。 它们作为测试用,通常被认为是一个守卫,你可以把它们与 yield 语法联合起来用。参见:
scala> val a = Array(1, 2, 3, 4, 5)
a: Array[Int] = Array(1, 2, 3, 4, 5)
 
scala> for (e <- a if e > 2) yield e
res1: Array[Int] = Array(3, 4, 5)


如上, 加上了 "if e > 2" 作为守卫条件用以限制得到了只包含了三个元素的数组。

总结
如果你熟悉 Scala 的 loop 结构, 就会知道在 for 后的圆括号中还可以许更多的事情。你可以加入 "if" 表达式,或别的语句, 比如下面的例子,可以组合多个 if 语句:
def scalaFiles =
  for {
    file <- filesHere
    if file.isFile
    if file.getName.endsWith(".scala")
  } yield file


yield 关键字的简短总结:
1.针对每一次 for 循环的迭代, yield 会产生一个值,被循环记录下来 (内部实现上,像是一个缓冲区)。
2.当循环结束后, 会返回所有 yield 的值组成的集合。
3.返回集合的类型与被遍历的集合类型是一致的。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Swift和Scala语法的比较

    Swift和Scala都提供了常见的控制流结构,如for循环、while循环和if条件语句。 在for循环中,Swift使用for-in来遍历集合或进行范围迭代,例如`for i in 1...5 { print("i=\(i)") }`,而Scala使用`for (i ) yield i^2...

    第4讲-Scala编程详解:条件控制与循环.rar

    在这个例子中,`for`循环首先过滤出偶数,然后将结果乘以2。 通过深入理解这些基本的控制结构和输入输出机制,开发者可以在Scala中编写出高效、优雅的代码。在实际编程中,灵活运用这些知识可以提高代码的可读性...

    Python yield 使用浅析

    初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和普通函数不一样,yield 到底用来做什么,为什么要设计 yield ?本文将由浅入深地讲解 yield 的概念和...

    scala核心编程总结

    值得注意的是,Scala中的for循环支持一种特殊的模式,允许开发者使用守卫条件和yield关键字来创建复杂的迭代逻辑。 6. **Pattern Matching(模式匹配)**:Scala的模式匹配功能强大,不仅可以用于匹配简单的值,还...

    spark+scala学习

    - for循环支持多种写法,可以使用 `yield` 关键字生成新的集合。 - foreach循环适用于遍历集合,可以接收其他函数作为参数。 **9. Scala函数的参数** - **Call By Value**:参数在调用时计算一次。 - **Call By ...

    scala for spark

    - **For表达式**:Scala的`for`循环使用`yield`关键字生成序列,`for (i )`生成1到10的区间。 **Scala函数特性**: - **定义函数**:函数可以有参数、返回值,函数体最后一行表达式的值即为返回值。 - **匿名函数**...

    Scala学习笔记(全)

    - `for`循环支持`yield`关键字,用于构建新的集合。 #### 三、高级特性 ##### 3.1 方法与函数 - **方法**:定义在类或对象中,可以有参数和返回值。 - **函数**:一种独立存在的值,可以作为参数传递或从方法返回...

    语言类--effective scala

    `for` 表达式是Scala中非常强大的工具之一,它允许我们以简洁的方式处理嵌套循环和其他复杂的逻辑。此外,`for` 表达式还支持一些特殊的语法特性,如使用 `{}` 代替 `()` 来推断分号,内联赋值、守卫表达式(guards...

    scala学习笔记

    - `for` 循环提供了丰富的功能,支持迭代、过滤(`if` 条件)和映射(`yield`)等功能。 - `while` 循环和 `do...while` 循环也得到了支持。 - **条件语句**: - 使用 `if...else` 结构进行条件判断。 - `match`...

    scala funsets.zip

    8. **`for`推导**:Scala的`for`循环语法糖可以优雅地组合多个高阶函数操作,提高代码可读性。例如,`for (x ) yield x * x`将返回列表中偶数元素的平方。 9. **类型推断**:Scala具有强大的类型推断系统,允许...

    scala PPt

    此外,Scala的for推导(comprehensions)是一种强大的循环和组合数据的工具,它可以用来遍历集合、执行过滤、映射和折叠等操作。例如,`for (x ) yield computation(x)`,这会创建一个新的列表,其中包含满足条件的...

    Scala编码规范(来自zhangyi教练博客)1

    2. **for 循环**:使用 for 表达式时,应将条件表达式放在 `yield` 之前,以保持代码整洁。例如: ```scala // 不推荐 for (file ) if (hasSoundFileExtension(file) && !soundFileIsLong(file)) soundFiles +=...

    SCALA 入门材料

    - **循环控制**:Scala提供了`for`循环和`while`循环,其中`for`循环更为常用。 - **方法与函数**: - 方法定义:Scala的方法定义与Java相似,但更简洁。 - 函数定义:在Scala中,函数被视为第一类公民,可以被...

    Scala数据库访问库ScalaSlick.zip

    Slick 是 TypeSafe 推出的 Scala 数据库访问库。开发者可以使用 Scala 语言风格来编写数据查询,而不是用 SQL,示例代码: object Coffees extends Table[(String, Int, Double)]("COFFEES") { def name = column...

    Scala-简易详解文章

    5. **语句块与流程控制**:Scala的流程控制结构包括条件语句(`if/else`)、循环(`for`、`while`)和异常处理(`try/catch/finally`)。`for`循环可以与`yield`结合创建新的集合。 6. **方法**:方法定义使用`def`...

    scala futures and promises

    为了更好地理解`Future`和`Promise`的作用,我们首先来看一个具体的例子:计算108(即1亿)个整数的和。对于这个问题,我们可以采用多种不同的方法来解决: 1. **Java 的 ExecutorService** 2. **Java 的 ForkJoin...

    Scala Cheat Sheet

    for推导式可以很容易地与if和yield一起使用,以执行过滤和转换操作。 集合也是Scala中非常重要的概念,包括列表(List)、元组(Tuple)和范围(Range)。Scala的列表是不可变的,可以使用::操作符来构造列表。元组...

    spark从入门到实战

    Scala的FOR循环具有独特的语法结构,支持嵌套循环、条件过滤等功能。通过引入`yield`关键字,还可以将其转换为生成器,用于创建列表或其他集合类型。 ```scala val numbers = for (i ) yield i * i println(numbers...

    Spark学习笔记

    此外,Scala的`for`循环还支持高级的嵌套循环和条件过滤: ```scala for (i ; j != j) { print((10 * i + j) + "") } ``` 这段代码通过一个高级`for`循环生成了一系列数字组合。 **2.6 求偶数** 为了求解偶数,...

Global site tag (gtag.js) - Google Analytics