Scala函数进阶(1)

37 阅读2分钟

函数的字面量

另一种定义函数的方式,它省略了def,函数名以及函数的返回值类型。

语法

var 变量 = (参数列表)=>{方法体}

定义函数的方式1:def

def getsum(x:Int,y:Int):Int={
      x+y
    }
def main(args: Array[String]): Unit = {
      println(getsum(10,20))
    }

定义函数的方式2:字面量

 val getsum1=(x:Int,y:Int)=>{
      x+y
    }
 def main(args: Array[String]): Unit = {
      println(getsum1(10,20))
    }    

字面量的简化写法

1.代码只有一句,省略{}

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

2.使用_来代替形参

 val getsum2=(_:Int)+(_:Int)
 
 val getsum3:(Int,Int)=>Int=_+_

把函数作为参数

定义一个接收函数作为参数的函数def a(f:()=>Unit)={},其中函数的类型()=>Unit部分()为函数的参数,Unit为函数的返回值。通过定义字面量传递值时,字面量必须和函数的类型匹配。

object day15 {
/*
 把一个函数  当做参数 传递给另一个函数
 */

  //定义两个字面量函数。(Int,Int)=>Int看成一种数据类型
  val f1:(Int,Int)=>Int=_+_
  //val a:Int

  val f2:(Int,Int)=>Int=_*_

  //定义一个函数,它有三个参数
  //参数1:类型是(Int,Int)=>Int,它表示这里需要一个函数
  def test(fn:(Int,Int)=>Int,x:Int,y:Int)={
    fn(x,y)
  }

  def main(args: Array[String]): Unit = {
    println(test(f1,10,20))
    println(test(f2,10,20))
  }
}

部分应用函数

如果一个函数包含多个参数,对该函数传递部分参数使得这个函数返回一个函数,那么这种函数叫做部分应用函数。

object day16 {
  /*
  部分应用函数

  如果一个函数需要3个函数,而我们只给了2个参数,会怎么样
   */
   def getsum(a:Int,b:Int,c:Int)={
     a+b+c
   }

  def main(args: Array[String]): Unit = {
    println(getsum(10,20,30))

    val t=getsum(10,20,_)//t就是部分应用函数

    val t1=getsum(_,20,_)//t就是部分应用函数

    println(t(50))

    println(t1(20,50))
  }
}
// 定义普通函数
def mutlti(x:Int, y:Int, z:Int) = {
  println(s"$x, $y, $z")
  x * y * z
}
// 传入部分参数,返回部分函数
var f1 = mutlti(2, _, _)
// 调用部分函数
println( f1(10, 5) )

高阶函数

高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。 Scala的常见高阶函数包括map、flatten、flatmap、foreach、reduce、filterfold等。

1.map函数

功能:通过对数组的每一个元素应用一个函数来构建一个新数组。

语法: 新数组 = 旧数组.map(旧元素=>新元素)

ac6eddc451da81cbc8f960504066d01609243114.png
例题:把数组(1,2,3,4,5) → (2,4,6,8,10)
object day17 {
  /*高阶函数:一种特殊的函数,它的参数或者返回值是函数类型
    1.map函数

   */
  def main(args: Array[String]): Unit = {
     val arr1=Array(1,2,3,4,5,6)
    //Array是一个构造器,用来定义一个数组
    //arr1就是一个数组对象,它有很多的方法,其中就要map
    // for循环来输出数组中每个元素

    val fn=(x:Int)=>x*2
    //fn是一个函数,它被传给了map。map是一个高阶函数
    val arr2=arr1.map(fn)

    for(i<- arr2){
      println(i)
    }
  }
}
u=4122266560,3930760529&fm=253&fmt=auto&app=138&f=JPEG.png
练习题1:把(1,2,3,4,5) → (1,4,9,16,25)
object day18 {
  def main(args: Array[String]): Unit = {
    val arr1=Array(1,2,3,4,5)

    val arr2=arr1.map(x=>x*x)

    for (i<-arr2){
      println(s"${i}")
    }
  }
}
练习题2:把(-1,2,-3,-4) → (1,2,3,4)
object day19 {
  def main(args: Array[String]): Unit = {
    val arr3=Array(-1,2,-3,-4)

    //绝对值
    val arr4=arr3.map(x=> if(x>0) x else -x)

    println()
    for(i <- arr4){
      println(s"${i}")
    }
  }

foreach函数

作用:对数组的每一个元素应用函数。

语法:数组.foreach(元素=>{})

object day19 {

  //foreach函数
  //是数组中的每一个元素都执行一次
  def main(args: Array[String]): Unit = {
    val arr1=Array(1,2,3,4,5)
     arr1.foreach(print)
     arr1.foreach(println)
  }
}

u=3566101786,1276308283&fm=253&fmt=auto&app=138&f=JPEG.webp