|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

 

 

posted on   yanqi_vip  阅读(18)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示