|NO.Z.00053|——————————|BigDataEnd|——|Hadoop&Scala.V01|——|Scala.v01|模式匹配和样例类|函数字面量|函数定义|

一、函数字面量及函数的定义
### --- 函数字面量及函数的定义

~~~     Scala中函数为头等公民,不仅可以定义一个函数然后调用它,
~~~     还可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量。
~~~     函数字面量体现了函数式编程的核心理念。
~~~     字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、
~~~     符号字面量、函数字面量等。什么是函数字面量呢?
~~~     在函数式编程中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作。
~~~     函数的使用方式和其他数据类型的使用方式完全一致,
~~~     可以像定义变量那样去定义一个函数,函数也会和其他变量一样,有类型有值;
~~~     就像变量的“类型”和“值”是分开的两个概念一样,
~~~     函数的“类型”和“值”也成为两个分开的概念;函数的“值”,就是“函数字面量”。
### --- 编程示例

scala> def add1(x: Int): Int = { x + 1 }
add1: (x: Int)Int
// 函数的类型为: (Int) => Int
// 输入参数列表只有一个括号,可以简写为: Int => Int

scala> def add2(x: Int, y: Int): Int = { x + y }
add2: (x: Int, y: Int)Int
// 函数的类型为: (Int, Int) => Int

scala> def add3(x: Int, y: Int, z: Int): Int = { x + y + z }
add3: (x: Int, y: Int, z: Int)Int
// 函数的类型为: (Int, Int, Int) => Int

scala>  def add4(x: Int, y: Int, z: Int): (Int, Int) = { (x + y, y + z) }
add4: (x: Int, y: Int, z: Int)(Int, Int)
// 函数的类型为: (Int, Int, Int) => (Int, Int)
### --- 函数类型

~~~     函数类型:(输入参数类型列表) => (输出参数类型列表)
~~~     只有一个参数时,小括号可省略;函数体中只有1行语句时,大括号可以省略;
~~~     把函数定义中的类型声明部分去除,剩下的就是函数的“值”,# 即函数字面量:
~~~     对 add1 而言函数的值为:(x) => x+1
~~~     对 add2 而言函数的值为:(x, y) => x+y
~~~     对 add3 而言函数的值为:(x, y, z) => x+y+z
~~~     对 add4 而言函数的值为:(x, y, z) => (x+y, y+z)
~~~     在Scala中我们这样定义变量: val 变量名: 类型 = 值;
### --- 我们可以用完全相同的方式定义函数: val 函数名: 函数类型 = 函数字面量
~~~     在Scala中有自动类型推断,所以可以省略变量的类型 val 变量名 = 值。

val add1: Int => Int = (x) => x+1
val add2: (Int, Int) => Int = (x, y) => x + y
val add3: (Int, Int, Int) => Int = (x, y, z) => x + y + z
val add4: (Int, Int, Int) => (Int, Int) = (x, y, z) => (x + y, y + z)
### --- 同样函数也可以这样: val 函数名 = 函数字面量
~~~     要让编译器进行自动类型推断,要告诉编译器足够的信息,所以添加了 x 的类型信息。

val add1 = (x: Int) => x + 1
val add2 = (x: Int, y: Int) => x + y
val add3 = (x: Int, y: Int, z: Int) => x + y + z
val add4 = (x: Int, y: Int, z: Int) => (x + y, y + z)
### --- 函数的定义:

~~~     val 函数名: (参数类型1,参数类型2) => (返回类型) = 函数字面量 val 函数名 = 函数字面量  
~~~     函数字面量:(参数1:类型1,参数2:类型2) => 函数体 val 函数名 = (参数1:类型1,参数2:类型2) => 函数体

 
 
 
 
 
 
 
 
 

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  阅读(14)  评论(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

导航

统计

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