Scala之方法和函数的定义和调用(3)

一  函数

  • 方法和函数的作用几乎是一样的 ,但是函数在使用的过程中更加灵活和多样化
  • 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) 函数可以作为方法的参数 ,和返回值类型

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Scala中,函数(function)和方法(method)是有一些区别的。 1. 定义方式:函数是通过`val`键字定义的值,而方法是通过`def`键字定义的类成员。 2. 形式:函数是一个独立的值,可以直接赋值给变量,作为参数传递给其他函数,或者作为返回值返回。方法则是属于类或对象的成员,需要通过实例或者类名来调用。 3. 参数列表:函数的参数列表可以用括号包裹,也可以省略括号。方法的参数列表总是需要用括号包裹。 4. 调用方式:函数可以直接使用参数列表调用,而方法需要通过对象或者类名来调用。 5. 带有副作用:函数通常是纯函数(pure function),即没有副作用的函数方法可以有副作用,例如修改对象的状态或者打印输出等。 下面是一个示例来说明函数方法的区别: ```scala // 定义函数 val add: (Int, Int) => Int = (x, y) => x + y // 定义类,并定义一个方法 class MyClass { def multiply(x: Int, y: Int): Int = x * y } // 创建类的实例 val obj = new MyClass() // 调用函数 val result1 = add(3, 4) println(result1) // 输出: 7 // 调用方法 val result2 = obj.multiply(3, 4) println(result2) // 输出: 12 ``` 需要注意的是,Scala方法可以转换为函数,而函数不能直接转换为方法。可以使用方法引用(method reference)或者使用下划线(_)来将方法转换为函数。例如: ```scala val multiplyFunc: (Int, Int) => Int = obj.multiply val multiplyFunc2: (Int, Int) => Int = obj.multiply _ ``` 总的来说,函数方法Scala中有些许的差异,但在实际使用中,它们可以互相转换和配合使用,根据需要选择合适的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值