我理解Ruby和Python的优点。Scala的yield是做什么的?
当前回答
val aList = List( 1,2,3,4,5 )
val res3 = for ( al <- aList if al > 3 ) yield al + 1
val res4 = aList.filter(_ > 3).map(_ + 1)
println( res3 )
println( res4 )
这两段代码是等价的。
val res3 = for (al <- aList) yield al + 1 > 3
val res4 = aList.map( _+ 1 > 3 )
println( res3 )
println( res4 )
这两段代码也是等价的。
Map和yield一样灵活,反之亦然。
其他回答
Yield比map()更灵活,参见下面的示例
val aList = List( 1,2,3,4,5 )
val res3 = for ( al <- aList if al > 3 ) yield al + 1
val res4 = aList.map( _+ 1 > 3 )
println( res3 )
println( res4 )
yield将像这样输出结果:List(5,6),这很好
而map()将返回如下结果:List(false, false, true, true, true),这可能不是你想要的。
根据Scala文档,它清楚地说“从现有的集合中生成一个新的集合”。
另一个Scala文档说,“Scala提供了一种轻量级符号来表示序列推导。推导式的形式为(enums) yield e,其中enums指以分号分隔的枚举数列表。枚举器可以是引入新变量的生成器,也可以是过滤器。”
它用于序列推导式(就像Python的列表推导式和生成器一样,在这里你也可以使用yield)。
它与for结合应用,并将一个新元素写入结果序列。
简单示例(来自scala-lang)
/** Turn command line arguments to uppercase */
object Main {
def main(args: Array[String]) {
val res = for (a <- args) yield a.toUpperCase
println("Arguments: " + res.toString)
}
}
f#中对应的表达式为
[ for a in args -> a.toUpperCase ]
or
from a in args select a.toUpperCase
在Linq中。
Ruby的产量有不同的影响。
为了理解,考虑以下内容
val A = for (i <- Int.MinValue to Int.MaxValue; if i > 3) yield i
大声读出来可能会有帮助
对于每一个整数i,如果它大于3,那么yield (produce) i并将其添加到列表a中。
在数学集合构建符号方面,上面的for-comprehension类似于
这可以理解为
"对于每一个整数,如果它大于,那么它就是集合中的成员"
或者作为替代
"是所有整数的集合,每个都大于"
关键字yield在Scala中只是简单的语法糖,可以很容易地用映射替换,Daniel Sobral已经详细解释过了。
另一方面,如果你在寻找类似于Python中的生成器(或延续),yield绝对会误导你。查看这个SO线程以获得更多信息:在Scala中实现“yield”的首选方式是什么?
推荐文章
- 将JAR文件添加到Spark作业- Spark -submit
- 函数式编程有软件工程方法论吗?
- Scala中的JavaConverters和JavaConversions有什么区别?
- 在Python中重置生成器对象
- 在Scala 2.8中<:<、<%<和=:=是什么意思?它们被记录在哪里?
- Scala vs Python的Spark性能
- 什么时候我应该在Scala中选择向量?
- 在Scala中,foldLeft和reducleft的区别
- 好的scalaz介绍
- Java SE 8有对或元组吗?
- Akka Kill vs Stop vs Poison Pill?
- 一个字符串的字符串列表
- 如何开始与Akka流?
- 对于没有null的语言的最佳解释
- Python:为什么functools。部分有必要吗?