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中方法和函数的区别相关推荐

  1. GO中方法和函数的区别

    package mainimport "fmt"type Student struct {Name string }func (s Student) test01() {fmt.P ...

  2. Java 方法与C语言函数微区别

    简介 Java 方法与C语言函数的区别在于函数的调用方式不同 示例 方式一: static法 public class Test {static void function(){System.out. ...

  3. c+和python的区别-与C ++相比,Python中方法和函数之间的差异

    如果您仍然不了解方法的工作方式,那么看一下实现也许可以澄清问题.当引用的实例属性不是数据属性时,将搜索其类.如果名称表示作为函数对象的有效类属性,则通过将实例对象和刚在抽象对象中一起找到的函数对象打包 ...

  4. Java关于equals()方法和“==”逻辑运算符的区别简介

    由于Java并没有像C++那样的重载运算符的机制,因此在比较类对象时,Java没有办法像C++那样通过重载==运算符来直接比较两个类对象是否相等,只能使用Object类中的equals()方法来对类对 ...

  5. [Java基础] Java8的Function函数及其使用

    前言 我们本期主要介绍下Java8的新特性, Function函数. 废话不多说, 我们直接进入正题部分. PS: 上海现在多数处于在家办公的状态. 自己的时间也稍微多了一点. Function函数列 ...

  6. Flink的各种Transformations 代码例子-- Java和Scala实现

    在上一篇博客<Flink创建数据源的各种方式–Java和scala实现>中,介绍了Flink的创建数据源的各种方式,本篇就开始介绍大数据处理的第二步,转换.同样,本文均参考自Flink官网 ...

  7. pmp访谈法和焦点小组区别_访谈和书评:《简而言之的Java》,第六版

    pmp访谈法和焦点小组区别 本杰明·J·埃文斯(Benjamin J. Evans)和戴维·弗拉纳根(David Flanagan) 撰写的第六版Java in Nutshell是对Nutshell系 ...

  8. 技术沙龙系列之:Scala method(方法) 和 functio(函数) 的区别

    下面来简单介绍一下如何来认识Scala method(方法) 和 functio(函数) 的区别,具体如下所示: 在我没有学习 scala 的时候,主要用 java 和 python 做日常工作开发, ...

  9. 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 ...

最新文章

  1. 神经网络到底是如何做出决策的?
  2. Windows Server 2012正式版RDS系列④
  3. 具有只读属性的ComboBox
  4. 高并发下的 HashMap 为什么会死循环
  5. Struts2中UI标签之表单标签介绍
  6. oracle怎么扩大连接数,如何增加ORACLE连接数
  7. phpstorm如何同时打开两个文件夹_iPhone如何同时添加两个不同的面容ID?
  8. 纪念一下挖到CSDN官网漏洞
  9. 计算机硬盘型号怎么看,硬盘编号怎么看
  10. java华氏度xhuan_华氏摄氏转换
  11. 数字签名 —— 哈希 + 私钥加密
  12. 微信小程序做图片压缩
  13. 车型识别API调用与批量分类车辆图片
  14. 5GC 关键技术之网络切片
  15. Windows MongoDB 安装及配置
  16. 9_1 法律法规标准化
  17. 字符串的下划线命名和驼峰命名转换
  18. 2012-01-16
  19. 2021复旦大学计算机专业,2021年度复旦大学计算机科学技术学院多媒体技术基础试题.doc...
  20. 【CP2K教程(二)】石墨烯和 h-BN 的投影态密度

热门文章

  1. 60-100-024-使用-MySQL 表锁
  2. 【Elasticsearch】Elasticsearch 相关度评分 TFIDF
  3. 【Kafka】kafka 重平衡(Rebalance)
  4. 60-300-022-使用-延迟数据-Flink中allowedLateness详细介绍
  5. 95-080-054-源码-启动-启动TaskManager
  6. IDEA 安装插件Plugin 'Scala' is incompatible with this installation
  7. php 存储过程 sqlsrv_query,php-PHP如何得用sqlsrv函数来调用MSSQL中的存储过程,并返回数据集?...
  8. java输出object object_js控制台显示[object Object]问题
  9. Springboot 关于日期时间格式化处理方式总结
  10. '=='和equals区别以及jvm内存分配