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>
本文来自博客园,作者:duchaoqun,转载请注明原文链接:https://www.cnblogs.com/duchaoqun/p/d56aa807f7d592fc598bf8b5c7d8a8e6.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 中如何实现缓存的预热?