我正在学习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)。
我总是看到以下符号=>
,但他们从不解释它的作用。
有时候我认为这是一个演员阵容但是它完全不同,我希望你能把事情搞清楚。
答案 0 :(得分:5)
1。)是的,存在差异,第一个是在闭包内传递给for-comprehension的正常if
语句。第二个是真正的后卫。在调用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语句有一些好处。为了理解,您可以嵌套调用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
与正文None
分开。
在someFunction(i: (A) => Int)
中的类型签名中,它表示i
属于Function1[A,Int]
类型,请阅读“从A
到Int
的函数”。< / p>