我目前正在学习scala。我正在为不耐烦的人阅读 Scala。
1.)
警卫
有区别吗?
for (i <- 0 to 10)if (i % 2 == 0) println(i)
for (i <- 0 to 10 if i % 2 == 0) println(i)
2.)
我总是看到下面的符号=>
,但他们从不解释它的作用。
有时我认为这是一个演员表,但它是完全不同的东西,我希望你能把事情弄清楚。
我目前正在学习scala。我正在为不耐烦的人阅读 Scala。
1.)
警卫
有区别吗?
for (i <- 0 to 10)if (i % 2 == 0) println(i)
for (i <- 0 to 10 if i % 2 == 0) println(i)
2.)
我总是看到下面的符号=>
,但他们从不解释它的作用。
有时我认为这是一个演员表,但它是完全不同的东西,我希望你能把事情弄清楚。
1.)是的,有一个区别,第一个 ifif
闭包内的正常语句传递给 for-comprehension。第二个是真正的后卫。它实际上会withFilter
在调用之前调用范围foreach
。所以这两件事的翻译会是这样的:
0.to(10).foreach(i => if(i % 2 == 0) println(i) )
0.to(10).withFilter(x => x % 2 == 0).foreach(i => println(i))
要添加更多上下文,调用withFilter
甚至只是filter
代替使用普通的 if 语句有一些好处。在 for comprehension 中,您可以对 map、flatmap、filter、collect 等进行嵌套调用,因此如果添加警卫,您可以防止实际发生大量 af 调用。例如:
for {
x <- 0 until 10
y <- 10 until 20
} {
if(x % 2 == 0) println(x*y)
}
将调用实际关闭 100 次
for {
x <- 0 until 10
if x % 2 == 0
y <- 10 until 20
} println(x*y)
这只会调用它 50 次,而结果保持不变。
2.)
=>
将函数/闭包的参数列表与主体分开。
这case e: NumberFormatException => None
是偏函数的一部分。这里 将=>
“论点”e
与 body分开None
。
在类似 in 的类型签名中,someFunction(i: (A) => Int)
它意味着i
属于 type Function1[A,Int]
,读作“function from A
to Int
”。