|NO.Z.00054|——————————|BigDataEnd|——|Hadoop&Scala.V02|——|Scala.v02|模式匹配和样例类|函数方法区别|
一、函数与方法的区别
### --- 函数与方法的区别
scala> def addm(x: Int, y: Int): Int = x + y
addm: (x: Int, y: Int)Int
scala> val addf = (x: Int, y: Int) => x + y
addf: (Int, Int) => Int = <function2>
~~~ # 严格的说:使用 val 定义的是函数(function),使用 def 定义的是方法(method)。
~~~ # 二者在语义上的区别很小,在绝大多数情况下都可以不去理会它们之间的区别,
~~~ # 但是有时候有必要了解它们之间的不同。
~~~ # Scala中的方法与函数有以下区别:
~~~ Scala 中的方法与 Java 的类似,方法是组成类的一部分
~~~ Scala 中的函数则是一个完整的对象。
~~~ Scala 中用 22 个特质(从 Function1 到 Function22)抽象出了函数的概念
~~~ Scala 中用 val 语句定义函数,def 语句定义方法
### --- scala.def语句定义方法
~~~ 下面用三种方式定义了函数,其中第二种方式最常见
val adder1: (Int, Int) => Int = (x, y) => x+y
val adder2 = (x: Int, y: Int) => x+y
// Function2是特质,不能直接new
// new Function2[Int,Int,Int]{ ... } 其实是定义并实例化一个实现了 Function2 特质的类的对象
val adder3 = new Function2[Int, Int, Int]{
def apply(x: Int, y: Int): Int = {
x + y
}
}
~~~ 方法不能作为单独的表达式而存在,而函数可以;
~~~ 函数必须要有参数列表,而方法可以没有参数列表;
~~~ 方法名是方法调用,而函数名只是代表函数对象本身;
~~~ 在需要函数的地方,如果传递一个方法,会自动把方法转换为函数
### --- 编程示例
// 方法不能作为单独的表达式而存在,而函数可以
scala> def addm(x: Int, y: Int): Int = x + y
addm: (x: Int, y: Int)Int
scala> val addf = (x: Int, y: Int) => x + y
addf: (Int, Int) => Int = <function2>
scala> addm
<console>:13: error: missing argument list for method addm
scala> addf
res8: (Int, Int) => Int = <function2>
~~~ # 函数必须要有参数列表,而方法可以没有参数列表
scala> def m1 = "This is yanqi edu"
m1: String
~~~ # 函数必须有参数列表
scala> val f1 = () => "This is yanqi edu"
f1: () => String = <function0>
~~~ # 方法名是方法调用
scala> m1
res16: String = This is yanqi edu
~~~ # 函数名代表函数对象
scala> f1
res17: () => String = <function0>
~~~ # 这才代表函数调用
scala> f1()
res18: String = This is yanqi edu
~~~ # 需要函数的地方,可以传递一个方法
scala> val list = (1 to 10).toList
lst: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> def double(x: Int) = x*x
double: (x: Int)Int
scala> list.map(double(_))
res20: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
### --- 将方法转换为函数:
~~~ 写程序的时候是定义方法、还是定义函数?
~~~ 一般情况下,不对二者做区分,认为都是函数,更多的时候使用def定义函数。
~~~ # 注意:方法名与下划线之间有一个空格
scala> def f1 = double _
f1: Int => Int
scala> f1
res21: Int => Int = <function1>
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv015-scala
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通