Raf*_*ler 54 foreach loops scala
我正在通过Scala中的Programming工作,虽然我很想从Python的角度来看待事物,但我不想编写"Scala中的Python".
就控制流程来说,我不太清楚要做什么:在Python中,我们习惯于for x in some_iterable死亡,我们喜欢它.Scala中存在一个非常相似的构造,Odersky调用for 表达式,可能是为了将它与Java for循环区分开来.此外,foreach对于可迭代数据类型,Scala有一个属性(我想它将是一个属性,我不太了解Scala的名称).但是,foreach除了为容器中的每个项调用一个函数之外,似乎我不能做更多的工作.
这给我留下了一些问题.首先,表达式是Scala中的重要/大量使用的构造,就像它们在Python中一样;其次,我何时应该使用foreach而不是for表达式(除了在容器的每个项目上调用函数的明显情况之外)?
我希望我不是非常暧昧或过于宽泛,但我只想尝试Scala中的一些设计/语言基础(到目前为止看起来非常酷).
huy*_*hjl 59
python用于for列表推导和生成器表达式.这些与scala 表达式非常相似for:
这是python
>>> letters = ['a', 'b', 'c', 'd']
>>> ints = [0, 1, 2, 3]
>>> [l + str(i) for l in letters for i in ints if i % 2 == 0]
['a0', 'a2', 'b0', 'b2', 'c0', 'c2', 'd0', 'd2']
Run Code Online (Sandbox Code Playgroud)
这是scala
scala> val letters = List('a', 'b', 'c', 'd')
scala> val ints = List(0, 1, 2, 3)
scala> for (l <- letters; i <- ints if i % 2 == 0) yield l.toString + i
res0: List[java.lang.String] = List(a0, a2, b0, b2, c0, c2, d0, d2)
Run Code Online (Sandbox Code Playgroud)
每个构造都可以使用多个生成器/迭代器,应用过滤器表达式并生成组合表达式.在python (expr for v1 in gen1 if expr1 for v2 in gen2 if expr2)中大致相当于:
for v1 in gen1:
if expr1:
for v2 in gen2:
if expr2:
yield expr
Run Code Online (Sandbox Code Playgroud)
在scala for (v1 <- gen1 if expr1; v2 <- gen2 if expr2) yield expr中大致相当于:
gen1.withFilter(expr1).flatMap(v1 => gen2.withFilter(expr2).map(v2 => expr))
Run Code Online (Sandbox Code Playgroud)
如果你喜欢python for x in xs语法,你可能会喜欢scala for表达式.
Scala有一些额外的语法和翻译曲折.语法明智for可以与大括号一起使用,以便您可以将语句放在单独的行上.您还可以执行值分配.
val res = for {
i <- 1 to 20; i2 = i*i
j <- 1 to 20; j2 = j*j
k <- 1 to 20; k2 = k*k
if i2 + j2 == k2
} yield (i, j, k)
Run Code Online (Sandbox Code Playgroud)
也v1 <- gen1真的执行比赛case v1 => gen1.如果没有匹配,则从迭代中忽略这些元素.
scala> val list = List(Some(1), None, Some(2))
scala> for (Some(i) <- list) yield i
res2: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)
我认为for在语言中占有重要地位.从你正在阅读的书中可以看出,有一整章(23)关于它!
Dan*_*ral 25
是的,Scala用于理解(因为它们是众所周知的)被大量使用,但它们实际上只是特定方法组合的语法糖,并且许多人更喜欢直接调用这些方法而不是使用语法糖.
为了更好地理解Scala的理解,请参阅此问题.特别是,你会发现它与之for (x <- xs) f(x)相同xs.foreach(x => f(x)).
现在,你提到你似乎没有多少使用foreach方法,但我会指出几乎所有的Scala集合方法都是(或者可以)用just实现的foreach.请参阅文档Traversable- 所有方法都只能用于实现foreach.
请注意,Scala yield与Python没有任何相似之处yield- 您也可以查找该问题.
| 归档时间: |
|
| 查看次数: |
50011 次 |
| 最近记录: |