关于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.)是的,这是有区别的,如果你在闭包中的正常if
语句被传递给理解,那么它是第一个。 第二个是实际的后卫。 在调用foreach
之前,它实际上会在范围内调用withFilter
。 所以这两件事的翻译将如下所示:
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 {
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
函数”。