关于斯卡拉的问题

时间:2012-09-12 17:50:16

标签: 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 个答案:

答案 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]类型,请阅读“从AInt的函数”。< / p>