我理解Ruby和Python的优点。Scala的yield是做什么的?
当前回答
除非你能从Scala用户那里得到更好的答案(我不是),以下是我的理解。
它仅作为以for开头的表达式的一部分出现,该表达式说明如何从现有列表生成新列表。
喜欢的东西:
var doubled = for (n <- original) yield n * 2
因此,每个输入都有一个输出项(尽管我相信有一种方法可以删除重复项)。
这与yield在其他语言中所支持的“命令式延续”有很大不同,在其他语言中,它提供了一种方法,可以从一些具有几乎任何结构的命令式代码生成任意长度的列表。
(如果你熟悉c#,它更接近LINQ的选择操作符,而不是yield return)。
其他回答
是的,正如Earwicker所说,它几乎等同于LINQ的select,与Ruby和Python的yield关系不大。基本上,在c#中你会写
from ... select ???
而在Scala中则相反
for ... yield ???
同样重要的是要理解for推导式不仅适用于序列,还适用于任何定义了特定方法的类型,就像LINQ:
如果你的类型只定义map,它允许由 单独的发电机。 如果它定义了flatMap和map,则允许for-expression组成 几个发电机。 如果定义了foreach,则允许for循环而不产生yield(单个和多个生成器都可以)。 如果它定义了filter,则允许以If开头的for-filter表达式 在for表达式中。
val doubledNums = for (n <- nums) yield n * 2
val ucNames = for (name <- names) yield name.capitalize
注意,这两个for表达式都使用了yield关键字:
在for之后使用yield是“秘密武器”,它表示“我想从我在for表达式中迭代的现有集合中生成一个新的集合,使用所示的算法。”
从这里开始
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),这可能不是你想要的。
为了理解,考虑以下内容
val A = for (i <- Int.MinValue to Int.MaxValue; if i > 3) yield i
大声读出来可能会有帮助
对于每一个整数i,如果它大于3,那么yield (produce) i并将其添加到列表a中。
在数学集合构建符号方面,上面的for-comprehension类似于
这可以理解为
"对于每一个整数,如果它大于,那么它就是集合中的成员"
或者作为替代
"是所有整数的集合,每个都大于"
除非你能从Scala用户那里得到更好的答案(我不是),以下是我的理解。
它仅作为以for开头的表达式的一部分出现,该表达式说明如何从现有列表生成新列表。
喜欢的东西:
var doubled = for (n <- original) yield n * 2
因此,每个输入都有一个输出项(尽管我相信有一种方法可以删除重复项)。
这与yield在其他语言中所支持的“命令式延续”有很大不同,在其他语言中,它提供了一种方法,可以从一些具有几乎任何结构的命令式代码生成任意长度的列表。
(如果你熟悉c#,它更接近LINQ的选择操作符,而不是yield return)。
推荐文章
- 在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。部分有必要吗?
- Scala 2.8 breakOut
- 如何克隆一个案例类实例,只改变一个字段在Scala?
- ':_* '(冒号下划线*)在Scala中有什么作用?
- 我如何用groupBy计算发生的事件?