java partialfunction,scala中方法和函数的区别
Scala中既有函数也有方法,大多数情况下我们都可以不去理会他们之间的区别。但是有时候我们必须要了解他们之间的不同。
Scala中的方法跟Java的方法一样,方法是组成类的一部分。方法有名字、类型签名,有时方法上还有注解,以及方法的功能
实现代码(字节码)。
Scala中的函数是一个完整的对象。Scala中用22个特质(trait)抽象出了函数的概念。这22特质从Function1到Function22
如上图中的Function10代表的是:有10个形参,返回值为R(协变)的函数。
Scala中的函数其实就是继承了这些Trait的类的对象,如:我们通过函数字面量定义一个函数
其实上述函数的定义方式跟如下定义方式等同:
由于Function2是特质,不能直接new。上述new Function2[Int,Int,Int](){}其实是定义并实例化一个实现了Function2特质的类的对象。
apply是scala中的语法糖:对一个对象obj上调用obj(),scala编译器会转换为obj.apply();在一个类clazz上调用clazz(),scala编译器会转
换为clazz_company_obj.apply(),其中clazz_company_obj为clazz的伴生对象。
具体的差异,总结为如下几点:
1.方法不能作为单独的表达式而存在(参数为空的方法除外),而函数可以。如:
在如上的例子中,我们首先定义了一个方法m,接着有定义了一个函数f。接着我们把函数名(函数值)当作最终表达式来用,由于f本身就是
一个对象(实现了FunctionN特质的对象),所以这种使用方式是完全正确的。但是我们把方法名当成最终表达式来使用的话,就会出错。
2.函数必须要有参数列表,而方法可以没有参数列表
在如上的例子中,m1方法接受零个参数,所以可以省略参数列表。而函数不能省略参数列表
3.方法名是方法条用,而函数名只是代表函数对象本身
这个比较容易理解。因为保存函数字面量的变量(又称为函数名或者函数值)本身就是实现了FunctionN特质的类的对象,要调用对象的apply
方法,就需要使用obj()的语法。所以函数名后面加括号才是调用函数。如下:
4.在需要函数的地方,如果传递一个方法,会自动进行ETA展开(把方法转换为函数)
如果我们直接把一个方法赋值给变量会报错。如果我们指定变量的类型就是函数,那么就可以通过编译,如下:
当然我们也可以强制把一个方法转换给函数,这就用到了scala中的部分应用函数:
5.传名参数本质上是个方法
传名参数实质上是一个参数列表为空的方法,如下:
如上代码实际上定义了一个方法m1,m1的参数是个传名参数(方法)。由于对于参数为空的方法来说,方法名就是方法调用
,所以List(x,x)实际上是进行了两次方法调用。
由于List(x,x)是进行了两次方法调用,所以得到两个不同的值。
如果我们稍微修改一下函数的m1的定义,把x先缓存起来,结果就会跟以前大不一样。
java partialfunction,scala中方法和函数的区别相关推荐
- GO中方法和函数的区别
package mainimport "fmt"type Student struct {Name string }func (s Student) test01() {fmt.P ...
- Java 方法与C语言函数微区别
简介 Java 方法与C语言函数的区别在于函数的调用方式不同 示例 方式一: static法 public class Test {static void function(){System.out. ...
- c+和python的区别-与C ++相比,Python中方法和函数之间的差异
如果您仍然不了解方法的工作方式,那么看一下实现也许可以澄清问题.当引用的实例属性不是数据属性时,将搜索其类.如果名称表示作为函数对象的有效类属性,则通过将实例对象和刚在抽象对象中一起找到的函数对象打包 ...
- Java关于equals()方法和“==”逻辑运算符的区别简介
由于Java并没有像C++那样的重载运算符的机制,因此在比较类对象时,Java没有办法像C++那样通过重载==运算符来直接比较两个类对象是否相等,只能使用Object类中的equals()方法来对类对 ...
- [Java基础] Java8的Function函数及其使用
前言 我们本期主要介绍下Java8的新特性, Function函数. 废话不多说, 我们直接进入正题部分. PS: 上海现在多数处于在家办公的状态. 自己的时间也稍微多了一点. Function函数列 ...
- Flink的各种Transformations 代码例子-- Java和Scala实现
在上一篇博客<Flink创建数据源的各种方式–Java和scala实现>中,介绍了Flink的创建数据源的各种方式,本篇就开始介绍大数据处理的第二步,转换.同样,本文均参考自Flink官网 ...
- pmp访谈法和焦点小组区别_访谈和书评:《简而言之的Java》,第六版
pmp访谈法和焦点小组区别 本杰明·J·埃文斯(Benjamin J. Evans)和戴维·弗拉纳根(David Flanagan) 撰写的第六版Java in Nutshell是对Nutshell系 ...
- 技术沙龙系列之:Scala method(方法) 和 functio(函数) 的区别
下面来简单介绍一下如何来认识Scala method(方法) 和 functio(函数) 的区别,具体如下所示: 在我没有学习 scala 的时候,主要用 java 和 python 做日常工作开发, ...
- 09_Flink入门案例、word-count程序(java和scala版本)、添加依赖、Flink Streaming和Batch的区别 、在集群上执行程序等
1.9.Flink入门案例-wordCount 1.9.1.开发工具 1.9.2.编写java版本word-count程序 1.9.2.1.添加Flink Maven依赖 1.9.2.2.编写word ...
最新文章
- 神经网络到底是如何做出决策的?
- Windows Server 2012正式版RDS系列④
- 具有只读属性的ComboBox
- 高并发下的 HashMap 为什么会死循环
- Struts2中UI标签之表单标签介绍
- oracle怎么扩大连接数,如何增加ORACLE连接数
- phpstorm如何同时打开两个文件夹_iPhone如何同时添加两个不同的面容ID?
- 纪念一下挖到CSDN官网漏洞
- 计算机硬盘型号怎么看,硬盘编号怎么看
- java华氏度xhuan_华氏摄氏转换
- 数字签名 —— 哈希 + 私钥加密
- 微信小程序做图片压缩
- 车型识别API调用与批量分类车辆图片
- 5GC 关键技术之网络切片
- Windows MongoDB 安装及配置
- 9_1 法律法规标准化
- 字符串的下划线命名和驼峰命名转换
- 2012-01-16
- 2021复旦大学计算机专业,2021年度复旦大学计算机科学技术学院多媒体技术基础试题.doc...
- 【CP2K教程(二)】石墨烯和 h-BN 的投影态密度
热门文章
- 60-100-024-使用-MySQL 表锁
- 【Elasticsearch】Elasticsearch 相关度评分 TFIDF
- 【Kafka】kafka 重平衡(Rebalance)
- 60-300-022-使用-延迟数据-Flink中allowedLateness详细介绍
- 95-080-054-源码-启动-启动TaskManager
- IDEA 安装插件Plugin 'Scala' is incompatible with this installation
- php 存储过程 sqlsrv_query,php-PHP如何得用sqlsrv函数来调用MSSQL中的存储过程,并返回数据集?...
- java输出object object_js控制台显示[object Object]问题
- Springboot 关于日期时间格式化处理方式总结
- '=='和equals区别以及jvm内存分配