scala case 常用简写

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 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值