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

scala case 常用简写相关推荐

  1. Scala Case类和对象

    Scala是没有Java中的switch case语法的,相对应地,scala提供了更加强大的match case 语法,即模式piper,类替代switch case,match case也被称为模 ...

  2. scala case语句_Scala模式与case语句匹配

    scala case语句 Scala supports inbuilt pattern matching mechanism which is one of the more powerful fea ...

  3. 17 scala case class object

    17 scala case class object 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) Reac ...

  4. Scala Case Class介绍

    1.代码示例 package com.yy.base/*** case class 示例*/ abstract class Person case class Student(name:String, ...

  5. Scala——(常用类型与字面量,Scala类层次结构,值与变量自动类型推断,操作符,块表达式和赋值语句,输出和输出,字符串插值器,对象相等性)

    文章目录 常用类型与字面量 Scala类层次结构 值与变量&自动类型推断 操作符 块表达式和赋值语句 输出和输出 字符串插值器 对象相等性 常用类型与字面量 Scala和Java一样,有8种数 ...

  6. scala case class 继承_数字硬件系统设计之一:Scala快速入门(2)

    原想简单笼统介绍一下scala,后感觉这么做意思不大,网友看了和没看一样,还是应该稍微详细具体一点,故而把系列编号由(上)(中)(下),改为(上)(2)(3)(4)(5)....,(上)就是(1)吧, ...

  7. Scala Case

    /*** 支持模式匹配,默认实现了Serializable接口** 样例类: case class 类名(属性....)* 类名的定义必须是驼峰式,属性名称第一个字母小写*/ case class M ...

  8. scala case class入门

    case class的输出 如下没有写case class的toString方法,但是是可以输出的 object Test extends App {val p1 = Person("lim ...

  9. scala case语句中的中置表示法

    如果unapply方法产生一个对偶,则你可以在case语句中使用中置表示法 例如 :amt match {case a Currency u=> ...}  //等同于 case Currenc ...

最新文章

  1. 整数n的倒数第k个数字
  2. linux 压缩 解压缩 详解
  3. 容器装不下内容时,显示滚动条
  4. html让下拉条消失,CSS 实现隐藏滚动条同时又可以滚动
  5. keras用cpu加速_在训练某些网络时,Keras(Tensorflow后端)在GPU上比在CPU上慢CPU
  6. 几种简单的素数判定法(转)
  7. 关于C++里面使用set_union,set_intersections、set_merge、set_difference、set_symmetric_difference等函数的使用总结
  8. HDU 4747 Mex【线段树上二分+扫描线】
  9. jQuery获取隐藏文本域
  10. 论文降重神器,一键毕业,真香!错过就后悔一整年的论文降重指南
  11. python图书管理实训报告总结_图书管理系统实训报告正文
  12. 2021年进销存管理软件商户门店使用热度前十名排行榜
  13. 从云计算到容器到容器云
  14. 手写redis@Cacheable注解 支持过期时间设置
  15. 无线路由器服务器名怎么设置,服务器改无线路由器怎么设置
  16. 解决Windows Server 2008 R2安装声卡驱动后还是提示无音频设备的问题
  17. 中国人工智能城市排名榜公布,北京、杭州、深圳居前
  18. 华为4G无线路由器测试锁频软件,华为4g无线路由器 新款E5375路由器测试
  19. Arduino ESP8266通过 RF433数据收发实验
  20. 基于Bootstrap的超酷jQuery开关按钮插件

热门文章

  1. Command CompileAssetCatalog emitted errors but did not return a nonzero exit code to indicate failur
  2. 美团:踩雷好几年,才总结出的数据治理避坑攻略
  3. Centos8 部署Promethus(普罗米修斯)+grafana画图
  4. 获取公众号的关注链接
  5. html页面上使用vlc,在HTML页面上嵌入VLC插件
  6. 1分钟理清楚C++类模板和模板类区别
  7. 安卓android+rom定制,移植,安卓Android ROM定制移植教程.doc
  8. 沁恒CH341是一个USB总线的转接芯片
  9. 江开计算机应用基础第二次形考,江开计算机应用基础第二次形考作业
  10. 透析BAT人工智能生态图谱:AI大战一触即发