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
版权声明:本文为博主原创文章,转载请附上博文链接!
scala case 常用简写相关推荐
- Scala Case类和对象
Scala是没有Java中的switch case语法的,相对应地,scala提供了更加强大的match case 语法,即模式piper,类替代switch case,match case也被称为模 ...
- scala case语句_Scala模式与case语句匹配
scala case语句 Scala supports inbuilt pattern matching mechanism which is one of the more powerful fea ...
- 17 scala case class object
17 scala case class object 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) Reac ...
- Scala Case Class介绍
1.代码示例 package com.yy.base/*** case class 示例*/ abstract class Person case class Student(name:String, ...
- Scala——(常用类型与字面量,Scala类层次结构,值与变量自动类型推断,操作符,块表达式和赋值语句,输出和输出,字符串插值器,对象相等性)
文章目录 常用类型与字面量 Scala类层次结构 值与变量&自动类型推断 操作符 块表达式和赋值语句 输出和输出 字符串插值器 对象相等性 常用类型与字面量 Scala和Java一样,有8种数 ...
- scala case class 继承_数字硬件系统设计之一:Scala快速入门(2)
原想简单笼统介绍一下scala,后感觉这么做意思不大,网友看了和没看一样,还是应该稍微详细具体一点,故而把系列编号由(上)(中)(下),改为(上)(2)(3)(4)(5)....,(上)就是(1)吧, ...
- Scala Case
/*** 支持模式匹配,默认实现了Serializable接口** 样例类: case class 类名(属性....)* 类名的定义必须是驼峰式,属性名称第一个字母小写*/ case class M ...
- scala case class入门
case class的输出 如下没有写case class的toString方法,但是是可以输出的 object Test extends App {val p1 = Person("lim ...
- scala case语句中的中置表示法
如果unapply方法产生一个对偶,则你可以在case语句中使用中置表示法 例如 :amt match {case a Currency u=> ...} //等同于 case Currenc ...
最新文章
- 整数n的倒数第k个数字
- linux 压缩 解压缩 详解
- 容器装不下内容时,显示滚动条
- html让下拉条消失,CSS 实现隐藏滚动条同时又可以滚动
- keras用cpu加速_在训练某些网络时,Keras(Tensorflow后端)在GPU上比在CPU上慢CPU
- 几种简单的素数判定法(转)
- 关于C++里面使用set_union,set_intersections、set_merge、set_difference、set_symmetric_difference等函数的使用总结
- HDU 4747 Mex【线段树上二分+扫描线】
- jQuery获取隐藏文本域
- 论文降重神器,一键毕业,真香!错过就后悔一整年的论文降重指南
- python图书管理实训报告总结_图书管理系统实训报告正文
- 2021年进销存管理软件商户门店使用热度前十名排行榜
- 从云计算到容器到容器云
- 手写redis@Cacheable注解 支持过期时间设置
- 无线路由器服务器名怎么设置,服务器改无线路由器怎么设置
- 解决Windows Server 2008 R2安装声卡驱动后还是提示无音频设备的问题
- 中国人工智能城市排名榜公布,北京、杭州、深圳居前
- 华为4G无线路由器测试锁频软件,华为4g无线路由器 新款E5375路由器测试
- Arduino ESP8266通过 RF433数据收发实验
- 基于Bootstrap的超酷jQuery开关按钮插件
热门文章
- Command CompileAssetCatalog emitted errors but did not return a nonzero exit code to indicate failur
- 美团:踩雷好几年,才总结出的数据治理避坑攻略
- Centos8 部署Promethus(普罗米修斯)+grafana画图
- 获取公众号的关注链接
- html页面上使用vlc,在HTML页面上嵌入VLC插件
- 1分钟理清楚C++类模板和模板类区别
- 安卓android+rom定制,移植,安卓Android ROM定制移植教程.doc
- 沁恒CH341是一个USB总线的转接芯片
- 江开计算机应用基础第二次形考,江开计算机应用基础第二次形考作业
- 透析BAT人工智能生态图谱:AI大战一触即发