scala - 基础:method 和 function的区别

简单解释

方法(method)
在OOP中,方法作用于对象,是对象的行为,Java中的方法这样的,在Scala中的方法(method)也是如此,定义method的基本格式:
def 方法名称(参数列表):返回值 = 方法体

函数(function)
在scala中,函数被看做是一等公民,定义函数基本格式:
val f1 = (x: Int) => println(x) //打印
val f2 = (x1: Int) => x1 + 4 //将原数据+4

一些例子

scala> def add3(x:Int) = x + 3
add3: (x: Int)Int // 表示Method add3有一个参数Int型参数x,返回值是Int型.
scala> add3(3)
res0: Int = 6
scala> val f1 = (x:Int) => x + 3
f1: Int => Int = <function1> // 表示Function f1的method体接受一个Int型的参数,输出结果的类型是Int型。f1的类型是function1
scala> f1(3)
res1: Int = 6

区别

  • 参数列表对method是可选的,对function是必须的(function参数列表可以为空)
scala> def method = println("没有参数的方法")
method: Unit
scala> val function = () => println("没有参数的函数") // f2: () => Unit = <function0>
scala> val function = => println("没有参数的函数") // 编译错误,参数列表可以为空,但不能省略
  • Method名意味着Method调用,Function名只是代表Function自身
scala> method
没有参数的方法
scala> function
res10: () => Unit = <function0>
  • 在需要function的地方可以提供一个method(它会自动转换成function,该行为被称为ETA expansion)
// 高阶函数foreach接收的是一个函数,但也可以传入一个方法,scala会将这个方法自动转义成函数。
// foreach是List对象的一个高阶函数,它接收一个函数,并应用于List中的每一个元素,而method是一个方法。
def method(x: Any) = println(x)
val list = List[String]("Scala", "Spark", "Java")
list.foreach(method(_))

注意:
期望出现Function的地方,我们可以使用Method。
不期望出现Function的地方,Method并不会自动转换成Function。

在scala中操作符被解释成方法:

前缀操作符:op obj 被解释称obj.op
中缀操作符:obj1 op obj2被解释称obj1.op(obj2)
后缀操作符:obj op被解释称obj.op

可以在Method名后面加一个下划线强制变成Function。 注意: Method名与下划线之间至少有一个空格!!

scala> def method1(x:Int) = { x + 84 }
method1: (x: Int)Int
scala> val function1 = method1 _
function1: Int => Int = <function1>
scala> function1(3)
res5: Int = 87
scala>
posted @   duchaoqun  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示