case样本序列
先看一段代码
val func1: Int => Int = {
case x => 1
}
1
2
3
等号的右边是{case x => 1},一对花括号包裹着一个case语句。这样的用法看到过很多次,但是很少有资料解释为什么可以这样用。查阅过很多资料,最终在《programming in Scala》(scala编程:黄海旭,高宇翔译)里出现过一段话。“样本序列可以用在出现函数字面量的任何地方。实质上,样本序列就是函数字面量,而且更普遍。函数字面量有一个入口点和参数列表,但是样本序列可以有多个入口点,每个都有自己的参数列表。”这三句话总结起来有两点:
样本序列可以替代函数字面量使用
样本序列和一般函数字面量的不同在于有多个入口点,每个入口点有自己独立的参数列表
现在就可以解释为什么在代码中可以这样使用了,首先 val func1: Int => Int 声明了不可变变量要被赋值一个Int => Int 类型的函数字面量,所以{case x => 1}可以被赋值给func1。
这种用法在scala里十分常见。大家一定经常使用的函数如foreach():
def foreach[U](f: A => U) { while (hasNext) f(next()) }
1
大家习惯性的使用方式是:
Seq(1, 2, 3).foreach{case x => println(x)}
1
这是因为foreach要求使用一个A => U类型的函数字面量作为参数,所有可以使用样本序列{case x => println(x)}作为参数。而上面的代码其实是一种缩写,实际上应该是:
Seq(1, 2, 3).foreach({case x => println(x)}) //比上面的代码多了一对括号()
1
此外,如大家常用的操作,如map,reduce都可以用样本序列替换函数字面量。
以上展示的都是单行样本序列,然后还有多行样本序列,原理都是一样的。
一个问题?
scala中还有一个不常用的写法:
val func2: Int => Int = {
x => 1
}
1
2
3
这种写法和上面的上面的写法几乎一模一样,唯独少量一个case,不知道是不是样例类的一种简写。如果有知道的还请解释一下。我个人觉得有可能是闭包.
之前留了一个疑问,现在对这个疑问做下解释:
其实上面的例子很简单,只是一直陷入思维惯性,觉得很高深。我们在scala里是可以直接定义匿名函数的,如:
现在我们考虑给这个匿名函数赋给一个值:
val func2 = (x:Int) => 1+x
1
然后大家应该记得scala的代码块,就是花括号连同它包裹的地方是有值得,他的值就是最后一句代码所标识的值,那{(x:Int) => 1+x}的值就是(x:Int) => 1+x,那么上一句代码就可以表示为:
val func2 = {
(x:Int) => 1+x
}
1
2
3
然后只需要声明一下fun2的类型:
def func2:Int => Int = {
(x:Int) => 1+x
}
1
2
3
然后做一下缩写,如去掉花货号里的()和x的数据类型声明:
def func2:Int => Int = {
x: => 1+x
}
1
2
3
现在就得到了最初的形式。为了进一步验证正确性,可以尝试在花括号里加一些代码,发现也是可行的。
def func2: Int => Int = {
val y = 10
x: => 1 + x + y
}
1
2
3
4
然后我们尝试在代码块的最后加一些代码:
def func2: Int => Int = {
val y = 10
x => 1 + x + y
val z = 0
z
}
1
2
3
4
5
6
发现这样也是可行的,按理说这样应该不可以,因为代码块的最后一句是一个z代码的是一个Int类型,并不是 Int => Int类型的函数字面量。这是因为上面呢的代码产生了视觉误差,实际上应该是下面这样的。
def func2: Int => Int = {
val y = 10
x =>1 + x + y
val z = 0
z
}
最后两句代码是属于Int=>Int这个方法的方法体的
x =>{1 + x + y
val z = 0
z}
1
2
3
4
5
6
7
8
9
10
然后尝试把最后两句代码从里面的函数的方法体里取出来,就会报错:
def func2: Int => Int = {
val y = 10
{ x => 1 + x + y }
val z = 0
z
}
1
2
3
4
5
6
Error:(9, 13) type mismatch;
found : Int
required: Int => Int
z
---------------------
作者:齐梦星空
来源:CSDN
原文:https://blog.csdn.net/weixin_37275456/article/details/89672756
版权声明:本文为博主原创文章,转载请附上博文链接!