一 函数
- 方法和函数的作用几乎是一样的 ,但是函数在使用的过程中更加灵活和多样化
- scala 中函数是头等公民 ,可以作为方法的返回值和参数使用
- scala 是一个集面向对象和面向函数于一身的多范式编程语言 ,灵活的函数是函数式编程的一种体现
- 函数的使用使代码更加的简洁和优雅
1 函数是什么
是scala中的一种函数式编程语言 ,函数是 scala 中的头等公民 ,建议优先使用函数 .函数实现的功能和方法一样,但是我们可以把函数理解成一种特殊的业务逻辑对象 ,所有行数可以作为方法的返回值和参数...函数也是用来处理数据的代码封装
2 函数的定义
2.1 方式一(在实参这里指定参数数据类型,不需要指定返回值类型 ,scala编译器自动推导)
val| var 函数名称=(函数的参数列表) => 函数体
val parseStr = (str: String) => {
str.toUpperCase()
}
函数体中的内容只有一行代码可以省略大括号
var product = (x:Double) => x*x
注意 : 函数可以作为最终表达式存在 ,返回的内容就是函数的签名 ( 签名 : 函数的名称 ,函数的参数, 函数的返回值类型 ), 这种定义方式不需要指定返回值类型 ,编译器会自动推导
2.2 方式二 (函数名后面指定参数类型和返回值类型 ,在实际参数那里就不需要指定了)
val | var 函数名称:(输入参数类型)=> 返回值类型 = (参数的引用)=> 函数体
val add2:(Int,Int)=>Int=(x,y)=>{
x+y
}
add2 函数名
(Int ,Int) 要处理的参数类型列表
=>Int 函数处理完数据的返回值类型
=(x,y) 传入实际参数的接收变量名
{x+y} 函数体 运算求和
注意: 代码块的最后一行是函数的返回值 ,需要和=>(Int)类型保持一致
注意 : 代码块的最后一行是返回值
2.2.1 代码块是可以有返回值的 ,最后一行就是返回值 ,如果最后一行是 printlin () 打印代码 ,则返回 () .
2.2.2 流程分支中接收结果的是多个分支返回值的父类型 (AnyVal)
2.2.3 在函数表达式中 ,代码块的最后一行是函数的返回值 ,需要和 =>(数据类型) 类型保持一致
2.3 特殊的没有参数的函数
函数方式一 :没有参数的函数表达式
val show2=()=>{
println("show2......")
}
函数方式二 :没有参数的函数表达式
val show:()=>Unit=()=>{
println("show.....")
}
val get:()=>String=()=>{
"给你们"
}
没有参数的函数, scala编译器会自动推断类型
val get2=()=>{
""
}
代码块的最后一行是返回值
3 函数总结
- 函数中的参数列表可以有多个 ,也可以没有 ,没有参数的函数调用的时候不用写 ()
- 函数的参数和返回值类型可以是值类型 ,也可以是引用类型
- 方法的参数和返回值有一个是函数的方法就是高阶函数(方法)
- 函数的最后一行为推断函数返回值的重要依据 ,可以省略 return
- 函数中可以再声明函数
- 代码块的最后一行是函数的返回值 ,需要和 =>(数据类型) 类型保持一致
二 方法
是逻辑片段的封装 ,可以处理一个或多个数据 ,可以有返回值也可以没有 ,提高了代码的复用性
1 方法的定义
def functionName ([参数列表]) : [return type] = {
function body()
return [expr]
}
没有等号和方法体的方法称为抽象方法,抽象方法定义在抽象类和特质中
注意 : 代码块的最后一行是返回值
方法的定义 : def 方法名(参数名1:参数类型1,参数名2:参数类型2....):返回值类型={(return)方法体}
def add(x: Int, y: Int): Int = {
x + y
}
def add2(x:Int , y:Int ,z:Int): Int = {
return x+y+z
}
def show(x:String ,y:String): String={
return x+y
}
这里的 Unit 相当于 java 的 void
def show:Unit ={
println("show 身材")
}
def show1() :Unit={
println("show 孩子")
}
2 方法的调用
2.1 本类中 方法名(实参)
方法的定义 : def 方法名(参数名1:参数类型1,参数名2:参数类型2....):返回值类型={(return)方法体}
def add(x: Int, y: Int): Int = {
x + y
}
调用 add()方法
val sum1: Int = add(2,3)
println(sum1) // 5
方法的定义(参数是字符类型)
def show(x:String ,y:String): String={
return x+y
}
调用 show() 方法
val str: String = show("woaiqq","aibaobei")
println(str) // woaiqqaibaobei
这里的 Unit 相当于 java 的 void
def show:Unit ={
println("show 身材")
}
def show1() :Unit={
println("show 孩子")
}
调用 show 方法
show // show 身材
调用 show1() 方法 : 带括号的方法空参时 ,调用该方法的时候可以带括号也可以不带括号
show1() // show 孩子
show1 // show 孩子
2.2 调用object中的方法 类名.方法(实参)
object MyUtils {
def test1() :Unit={
println("这里调用的方法是在类之外的 object类中的方法........")
}
}
object MethodLearning01 {
def main(args: Array[String]): Unit = {
调用 object 类中的方法 ==> 类名.方法名()
MyUtils.test1() // 这里调用的方法是在类外的 object类中的方法........
}
}
2.3 调用 class 类中的方法 new 类() .方法名(参数)
class MyUtils{
def test2() :Unit={
println("这里调用的是类外的class类的方法..........")
}
}
object Method01 {
def main(args: Array[String]): Unit = {
调用 class 类中的方法 ==> new 类().方法名()
val ob = new MyUtils()
ob.test2() // 这里调用的是类外的 class类中的方法...........
new MyUtils().test2() // 这里调用的是类外的 class类中的方法..........
}
}
2.4 import 类(object)._ 调用方法 直接方法名
2.5 注意 :
- 没有参数的方法建议写上括号 ,如果不写,调用的时候也不要写 ;
- 方法的返回值 ,一般建议使用 return
3 函数和方法的互相转换和区别
3.1 互相转换
def add(x: Int, y: Int) = {
x + y
}
将方法转换成函数
val f = add _
当我们将方法作为参数传递的时候,其实底层就是将方法自动转换成函数
3.2 区别和联系
在函数式编程语言中 ,函数是"头等公民" ,它可以像任何其他数据类型一样被传递
函数可以当成值来进行传递 ,方法的参数和返回值都可以是函数
函数和变量 / 类 /对象 ,是一个级别的
1) 方法用 "def" 关键字定义 ,函数的标识是 "=>"
2) 方法不能作为最终的表达式存在 ,但是函数可以 ,返回函数的签名信息
3) 方法和函数调用的时候都需要显示的传入参数
4) 函数可以作为方法的参数 ,和返回值类型