Scala函数

1.基本语法

 解析main方法

def main(args: Array[String]): Unit = {函数体}

*def 关键字,声明一个函数
* main 方法名
* args 参数名称
* Array[String] 参数的类型
* Unit 返回值类型,相当于Java中的void,没有返回值
* {} 函数体

 函数省略规则

 (1)return可以省略,Scala会使用函数体的最后一行代码作为返回值

(2)如果函数体只有一行代码,可以省略花括号

(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)

(4)如果函数没有参数,那么小括号可以省略,调用时小括号也必须省略

 函数调用

 scala可以在类中定义函数,通过类的方法调用

在object中定义函数,通过类方法调用

同时可以在函数内部调用

2.函数式编程

面向函数编程: 将函数传来传去,将函数作为参数 或者是 返回值,需要考虑类型的限制

2.1 以函数为参数

package com.bigdata.scala

object DemoFun02 {

  // func1是一个”以String以及Int作为参数,Int作为返回值“类型的函数
  // (String,Int) => Int
  def func1(str: String, int: Int): Int = {
    str.toInt + int
  }

  //(Int,String)=>Int
  def func2(int: Int, string: String): Int = {
    int + string.toInt
  }

  //(String,Int)=>Int
  def func3(str: String, int: Int): Int = {
    str.toInt * int
  }

  // String => Int
  def func4(str: String): Int = {
    str.toInt + 100 + 100
  }

  // 定义一个函数funcX,能够接收一个函数func
  // 接收的函数func的类型为  (String,Int) => Int
  // 最终实现对传入的函数func进行调用,并打印返回的结果
  def funcX(func:(String,Int)=>Int):Unit={
    val i: Int = func("100", 200)
    println(i)
  }

  def main(args: Array[String]): Unit = {
    funcX(func1)
  }

}

2.2 匿名函数

没有名字的函数就是匿名函数

定义匿名函数:(参数名:参数类型,参数名:参数类型,参数名:参数类型) => {方法体}

package com.bigdata.scala

object DemoAnoymousFun {

  //定义匿名函数
  (str:String,int:Int)=>{
    str.toInt+int
  }

  //为匿名函数取名
  val anonymousFun: (String, Int) => Int = (str: String, int: Int) => {
    str.toInt + int
  }

  def funcX(func: (String, Int) => Int): Unit = {
    val i: Int = func("100", 200)
    println(i)
  }

  def funcX2(func: String=> Int): Unit = {
    val i: Int = func("100")
    println(i)
  }


  def main(args: Array[String]): Unit = {
    //调用匿名函数,调用函数名,间接调用
    funcX(anonymousFun)
    //直接调用匿名函数
    funcX((str: String, int: Int) => {str.toInt + int})

    //几种省略
    funcX((str: String, int: Int) => str.toInt + int) //一行函数体,省略{}
    funcX((str,int)=>str.toInt+int) //匿名函数是作为参数传递给另一个函数,则参数的类型可以省略

    funcX2(str=>str.toInt) //如果匿名函数的参数只有一个,则括号可以省略
    funcX2(_.toInt)/*如果匿名函数的参数只有一个,并且只被使用了一次,则可以用下划线替代,
    并且关于参数声明的部分可以直接省略,以及 => 也需要省略*/
  }

}

匿名函数的省略规则

1、如果代码只有一行 花括号可以省略

2、如果匿名函数作为 参数 传给另外一个函数 则匿名函数的参数类型可以省略

3、如果匿名函数只有一个参数则括号可以省略

4、如果匿名函数中的参数在逻辑中只使用了一次 则可以用下划线替代 然后 => 左边的部分可以省略

 2.3 函数作为返回值

package com.bigdata.scala

object DemoFun03 {
  //函数作为返回值,返回值的类型无法推断,需要手动指定
  def fun01(str:String): Int=>Int = {
    def fun01_01(int: Int):Int={
      str.toInt+int+100
    }
    fun01_01
  }

  //简化函数定义
  def fun02(str: String)(int:Int): Int = {
      str.toInt + int + 100
  }

  //函数柯里化
  //将有N个参数的函数,变成N个只有一个参数的函数
  def func03_KL(i1: Int)(i2: Int)(i3: Int)(i4: Int)(i5: Int): Int = {
    i1 + i2 + i3 + i4 + i5
  }

  def main(args: Array[String]): Unit = {
    val intToInt: Int => Int = fun01("20")
    val i: Int = intToInt(20)
    println(i)

    //简化调用
    println(fun01("20")(20))

    println(fun02("50")(50))

    val kl: Int => Int => Int = func03_KL(1)(2)(3)
    println(kl(40)(50))
  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值