[阿强的自学之路]----Scala学习笔记 Day06:函数的高级用法

函数的高级用法:

1、函数可以作为值进行传递:

def fun1(a:Int):Int = {
    return a+1
}

val f1 = fun1(3)//得到的是函数的返回值
val f2 = fun1 _ //用“空格”+“_”的表示对函数本身的调用
println(f1)
printle(f2)

运行结果为:

4
function_learn.High_Order_Function$$$Lambda$1/1023892928@31b7dea0

 

f2的返回值是一个地址。

如果能知道函数的参数类型和返回值类型,可以不用_也能进行函数的传递:

val f1:Int => Int = add

 

2、函数可以作为函数的参数进行传递:


  def main(args: Array[String]): Unit = {
    def add(a:Int,b:Int):Int= a+b
    def v1(func:(Int,Int) => Int,a:Int,b:Int): Int ={
      func(a,b)
    }
    println(v1(add,12,15))
  }

也可以传递匿名函数。

3、函数可以作为函数的返回值返回:

  def v2(): Int=>Unit = {
    def v3(a:Int): Unit = println("i am v3")
    v3
  }
  println(v2())
}

运行结果为:

Package01.Test02$$$Lambda$3/97730845@50675690

这是因为v2返回的是一个函数v3,如要调用v3函数,可以新建一个变量接受v2的返回值:

  val v4 = v2()
  println(v4(1))

返回值是:

i am v3
()

Scala中还可以直接调用:

println(v2()(1))

与上述代码效果相同。

函数高级用法的小例子:

def main(args: Array[String]): Unit = {
    val arr:Array[Int] = Array(12,14,16,21)
    def f1(arr:Array[Int],op:Int => Int):Array[Int]={
      for(elem <- arr) yield op(elem)
    }
    def AddOne(elem:Int):Int= elem+1
    val newArray: Array[Int] = f1(arr,AddOne)
    println(newArray.mkString(","))
  }

扩展练习:

练习  1:定义一个匿名函数,并将它作为值赋给变量  fun。函数有三个参数,类型分别为 Int,String,Char,返回值类型为 Boolean。要求调用函数  fun(0, “”, ‘0’)得到返回值为  false,其它情况均返回  true。

def main(args: Array[String]): Unit = {
    val fun = (i1:Int,s1:String,c1:Char) => {
      if(i1 == 0 && s1 == "" && c1 == '0')false
      else true
    }
    var v1 = fun(0,"",'0')
    println(v1)
    println(fun(0,"",'0'))
  }

 

练习2:定义一个函数 func,它接收一个 Int 类型的参数,返回一个函数(记作 f1)。 它返回的函数 f1,接收一个 String 类型的参数,同样返回一个函数(记作 f2)。函数 f2 接 收一个 Char 类型的参数,返回一个 Boolean 的值。要求调用函数  func(0) (“”) (‘0’)得到返回值为  false,其它情况均返回  true。

    def func(i:Int): String => Char =>Boolean={
      def f1(s:String): Char => Boolean = {
        def f2(c:Char):Boolean = {
          if(i == 0 && s =="" && c == '0') false else true
        }
        f2
      }
      f1
    }
    println(func(0)("")('0'))

可以简化,func函数中可以不关心嵌套函数的名称,f1 f2可以用匿名函数表达:

    def func(i:Int): String => Char =>Boolean={
//写到一行以后括号可以省略
      (s:String)=> (c:Char)=>if(i == 0 && s =="" && c == '0') false else true
    }
    println(func(0)("")('0'))

并且func中已经表明了类型,所以类型可以省略:

    def func(i:Int): String => Char =>Boolean={
      s=> c=>if(i == 0 && s =="" && c == '0') false else true
    }
    println(func(0)("")('0'))

这样的代码就非常简洁了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值