版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问:https://blog.csdn/qq_21439395/article/details/80962507

交流QQ: 824203453

 

方法和函数

方法:一段业务逻辑的综合。

1.1.  定义方法

java中的方法:

publicint add(int a,int b){

returna + b;

}

scala中的方法:

 

def methodName([list of parameters]) : [return type] = {}
/**
  * 方法的定义及调用
  *
  * 定义方法的格式为:
  * def methodName ([list of parameters]) : [return type] = {}
  * 如果不使用等号和方法体,则隐式声明抽象(abstract)方法。
  */
  object ScalaMethod extends App{
  
    // 定义个sum方法, 该方法有2个参数, 参数类型为整型, 方法的返回值为整型
    def sum(a:Int, b: Int): Int = {
        a + b
    }
   // 定义有可变参数的方法,
   def sumAll(b: Int*): Int = {
    var v = 0
    for (i<- b){
       v += i
     }
    v  // 返回值
   }
    // 调用
    val result1 = sum(1, 5)
    println(result1)
println(sumAll(1,11,13))
  
    // 该方法没有任何参数, 也没有返回值
    def sayHello1 = println("Say BB1")
    def sayHello2() = println("Say BB2")
    sayHello1 // 如果方法没有() 调用时不能加()
    sayHello2 // 可是省略(), 也可以不省略
  }

 

 

 

如果有return关键字,必须要有返回值类型,否则报错如下:

 

方法总结:

1, 定义方法的关键字,def   

格式: def  方法的名称(参数列表):返回值类型 = {方法体内容}

2, 方法的返回值,最后一行的内容,如果是循环,那么返回值是Unit

3, 如果空参方法,定义的时候有(),调用的时候可以省略(),但是如果定义的时候没有(),调用方法的时候,不能加()

4, 方法的返回值类型,可以省略,但是特殊情况下,必须加上:

4.1,方法有return关键字

4.2,递归调用的方法。

5,方法不能最为最终的表达式存在,(空参的方法调用除外)

1.2.     定义函数

和方法类似,基本能实现相同的功能

val| var   函数名称=(函数的参数列表) =>  函数体

 

 

函数可以作为最终的表达式存在,返回的内容就是函数的签名

签名(函数的名称,函数的参数,函数的返回值类型)

这种定义方式不需要指定返回值类型,编译器会自动推断

 

第二种定义方式:

复杂全面的定义

val |var  函数名称:(输入参数类型)=> 返回值类型 = (参数的引用)=> 函数体

定义一个无参的函数

不同于方法,没有参数的函数定义,也必须加()

valf2:()=>Unit =() => println(123)  valf2 =() => println(123)  返回值类型为Unit

valf2:()=>Int =() => 123   val f2=()=> 123  返回值类型为Int

 

 

 

1.3.     方法和函数的区别

在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作

函数可以当成值来进行传递,方法的参数和返回值都可以是函数。

函数和变量,类,对象, 是一个级别的。

区别和联系:

1, 方法用def关键字定义,函数的标识 =>

2, 方法不能作为最终的表达式存在,但是函数可以,返回函数的签名信息

3, 方法和函数调用的时候都需要显示的传入参数

4, 函数可以作为方法的参数,和返回值类型。

 

案例:首先定义一个方法,再定义一个函数,然后将函数传递到方法里面

 

object MethodAndFunctionTest {
  //定义一个方法
  //方法m2参数要求是一个函数,函数的参数必须是两个Int类型
  //返回值类型也是Int类型
  def m1(f: (Int, Int) => Int) : Int = {
    f(2, 6)
  }
  
  //定义一个函数f1,参数是两个Int类型,返回值是一个Int类型
  val f1 = (x: Int, y: Int) => x + y
  //再定义一个函数f2
  val f2 = (m: Int, n: Int) => m * n
  
  //main方法
  def main(args: Array[String]) {
  
    //调用m1方法,并传入f1函数
    val r1 = m1(f1)
    println(r1)
  
    //调用m1方法,并传入f2函数
    val r2 = m1(f2)
    println(r2)
  }
}
// 定义一个普通方法
def max(x:Int,y:Int) = if(x>y)x else y

// 定义一个方法,参数是一个函数,参数只需要函数签名,在调用的时候具体再传入函数体
def max1(f:(Int,Int)=>Int) = f(20,10)
def max2(f:(Int,Int) => Int,x:Int,y:Int)= f(x,y)

// 定义一个方法,方法返回值是函数
def max3()= (x:Int,y:Int)=> if (x>y) x else y
def main(args: Array[String]): Unit = {

  println(max(10,20))
  println(max1((x:Int,y:Int)=>if(x>y) x else y))
  println(max2((x:Int,y:Int)=>if(x>y) x else y,10,20))
  println(max3()(10,20))
}

 

 

 

1.4.     将方法转换成函数(神奇的下划线)

 

1.5.  方法和函数的总结(重点):

1,方法的定义 使用def 关键字    函数的定义 使用   =>

函数有两种定义方式 

val  f = (x:Int,y:Int) => x + y

val  f:(Int,Int) => Int = (x,y) =>  if(x>y) x else y

2,方法不能作为最终的表达式存在,但是函数可以作为最终的表达式存在,返回函数签名

函数签名:函数的名称,参数类型,返回值类型   函数的别名(函数参数个数)

3,方法和函数的调用,方法和函数可以相互调用。

方法名称(参数列表)   函数名称(参数列表)

无参的方法可以省略(),无参的函数不能省略括号

4,函数是一等公民,可以作为方法的参数和返回值类型。

       函数作为方法的参数: 定义方法的时候,函数参数规范(函数的名称,参数类型,返回值类型),然后在调用方法的时候,传递的是一个已存在的函数,或者是一个匿名函数。都要求传入的函数,必须满足定义的规范,使用匿名函数的时候,可以省略参数类型((x,y)=>x*y)

       函数最为方法的返回值类型,当调用方法的时候,返回函数,传入参数进行函数的调用。

5, 方法可以转化为函数,通过在方法名称 _ ,另外当方法的参数是一个函数的时候,满足条件的方法会被自动转换为函数,进行传递。

def method1(f: (Int, Int) => Int): Int = {

     |     // 可以调用函数

     |     f(1, 100)

     |   }

def max(x:Int,y:Int) =  x * y

method1(max _)

method1(max)   // 方法自动转换为函数

 

方法和函数应该怎么使用?

一般情况下,优先使用函数

实际上,还是定义方法使用的更多,函数会作为方法的参数。

最最常用的:调用方法的时候传递函数。

 

def methodName([list of parameters]) : [return type] = {}

 

版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问:https://blog.csdn/qq_21439395/article/details/80962507

交流QQ: 824203453

更多推荐

scala函数式编程系列(三)--- scala方法和函数