Scala 的 yield 例子 (for 循环和 yield 的例子)
来源:互联网 发布:二级ms office软件 编辑:程序博客网 时间:2024/06/07 17:56
我看了《Programming in Scala》一书,仍然对 Scala yield 关键字的理解不甚清楚。起初我以为 Scala yield 的与 Ruby 的 yield 是一样,Ruby 中 yield 是被传入代码块的占位符。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
res
10
:
scala.collection.immutable.IndexedSeq[Int]
=
Vector(
1
,
2
,
3
,
4
,
5
)
scala>
for
(i <-
1
to
5
)
yield
i *
2
res
11
:
scala.collection.immutable.IndexedSeq[Int]
=
Vector(
2
,
4
,
6
,
8
,
10
)]
这里是 for/yield 循环的求模操作:
scala>
for
(i <-
1
to
5
)
yield
i
%
2
res
12
:
scala.collection.immutable.IndexedSeq[Int]
=
Vector(
1
,
0
,
1
,
0
,
1
)
Scala 数组上的 for 循环 yield 的例子
之前提到过 for 循环 yield 会构造并返回与给定集合相同类型的集合. 为此, 我们来看看以下用 Scala 数组上的例子. 注意把 yield(我们可以把 yield 用作一个动词) 出来的集合类型与前面的几个例子对比:
a
:
Array[Int]
=
Array(
1
,
2
,
3
,
4
,
5
)
scala>
for
(e <- a)
yield
e
res
5
:
Array[Int]
=
Array(
1
,
2
,
3
,
4
,
5
)
scala>
for
(e <- a)
yield
e *
2
res
6
:
Array[Int]
=
Array(
2
,
4
,
6
,
8
,
10
)
scala>
for
(e <- a)
yield
e
%
2
res
7
:
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
res
1
:
Array[Int]
=
Array(
3
,
4
,
5
)
如上, 加上了 "if e > 2" 作为守卫条件用以限制得到了只包含了三个元素的数组.
Scala for 循环和 yield 的例子 - 总结
如果你熟悉 Scala 的 loop 结构, 就会知道在 for 后的圆括号中还可以许更多的事情. 你可以加入 "if" 表达式,或别的语句, 比如下面的例子,可以组合多个 if 语句:
def
scalaFiles
=
for
{
file <- filesHere
if
file.isFile
if
file.getName.endsWith(
".scala"
)
}
yield
file
yield 关键字的简短总结:
- 针对每一次 for 循环的迭代, yield 会产生一个值,被循环记录下来 (内部实现上,像是一个缓冲区).
- 当循环结束后, 会返回所有 yield 的值组成的集合.
- 返回集合的类型与被遍历的集合类型是一致的.
参考自:Scala yield examples (for loop and yield examples)
- Scala 的 yield 例子 (for 循环和 yield 的例子)
- Scala 的 yield 例子 (for 循环和 yield 的例子)
- Scala 的 yield 例子 (for 循环和 yield 的例子)
- Scala 的 yield 例子 (for 循环和 yield 的例子)
- scala里面的for...yield循环
- Scala 的 yield
- scala for循环 yield 用法 自我理解
- scala中yield的使用
- Python yield例子
- 一个yield使用例子
- 多线程例子:yield
- Scala开篇-for循环高级应用之yield
- python iterator迭代器、yield、container容器和for循环的联系与区别
- Scala中的for/yield详解
- scala yield和文件的操作
- ES6详解七:循环的秘密 - iterator 和 yield
- for循环的简单例子
- for循环的一个例子
- ecshop微信小程序接口插件
- MAC OSX10.12.x 使用Qt5.7出现的错误及解决方案
- 文件的基本操作-字符的读写
- 知识库--Reloader interface(47)
- sql语句 查询表中 每门课都大于80分的学生名称 根据以下三种 学习sql 中其他函数的使用
- Scala 的 yield 例子 (for 循环和 yield 的例子)
- 正则表达式中的基本正则规则详解01
- 【C#】39. 前台线程与后台线程
- java webservice soap消息请求例子
- ESP8266移植MQTT连接中移ONENET
- 10个经典的Java main方法面试题
- Collection
- 关于iptables
- http协议中的get和post