大数据学习之Scala语言函数学习37

五:scala函数

1函数创建方式

方式1方法转换为函数

方式:方法名 _

 

res6: (Int, Int) => Int = <function2>

<function2>

代表一个函数,并且有两个参数。

(Int, Int)

代表参数列表

Int

代表返回值类型

=>

代表函数

 

 

方式2 定义函数:

val h1 = (a:Int,b:Int) => {a * b}

h1:函数名

(a:Int,b:Int):函数的参数类型

{a * b}:函数体

 

2传值调用&传名调用

 

函数式编程:方法的参数可以是一个函数

 

编写代码来说明这个问题

package dawn.day02

/**
  * @author Dawn
  * 2019年6月11日17:56:52
  * @version 1.0
  * 传值调用&传名调用 测试
  */
object ZFBToPay {

  var money=1000

  //每次吃饭花50
  def eat()={
    money-=50
  }

  //余额
  def balance():Int={
    //已调用一次eat方法
    eat()
    money
  }

  //传值调用:传递的是函数 call by value
  def printMoney1(x:Int):Unit={
    for(a <- 1 to 5){
      println(s"你的余额现在为:$x")
    }
  }

  //传名调用测试 (实际上传的是一个函数)call by name
  //此时余额减了5次 x: => Int 表示的是一个方法的签名 没有参数 返回值是int类型的函数
  def printMoney2(x: => Int):Unit={
    for(a <- 1 to 5){
      println(s"你的余额现在为:$x")
    }
  }

  def main(args: Array[String]): Unit = {
    //    eat()
    //    balance()
    //传值调用: call by value,这里就相当只调用了一次
//    printMoney1(balance())

    //传名调用 call by name,函数实参每次在函数体内被用到时都会求值
    printMoney2(balance)
  }
}

  

传值调用:

1.先计算balance的值

2.把这个值作为参数传递给printMoney

运行结果:

 

传名调用:传递的是函数

balance方法的名称传递到方法内部执行

运行结果:

3 可变参数函数

java中的可变参数:public static void m1(String ...arg){}

 

scala中的可变参数:def sum(ints:Int*): Int ={}

加了通配符*

代码如下:

package dawn.day02
/**
  * @author Dawn
  * 2019年6月11日18:22:13
  * @version 1.0
  * 测试函数的可变参数
  */
object ManyParam {

  def sum(moneys:Int*):Int={
    var sum=0
    for (v <- moneys){
      sum+=v
    }
    sum
  }

  /*
      不仅是可变参
      而且参数的类型不一致
      Any
     */
  def setName(params:Any*):Any={
    return params
  }
  def main(args: Array[String]): Unit = {
    println(sum(1,5,6,4))
    println(setName("dawn",20,"渴望恋爱"))
  }
}

 

运行结果

4 默认参数值函数

如果传递了参数,则使用传递的值。如果不传递参数,则使用默认

 

 

运行结果如下:

5高阶函数

定义:将其他函数作为参数,或者其结果是函数的函数。

示例1

*)首先,定义一个最普通的函数

*)再定义一个高阶函数

*)分析这个高阶函数调用的过程

 

 

示例2

在这个例子中,首先定义了一个普通的函数mytest,然后定义了一个高阶函数myFunctionmyFunction接收三个参数:第一个f是一个函数参数,第二个是x,第三个是y。而f是一个函数参数,本身接收两个Int的参数,返回一个Int的值。

 

 

6 部分参数应用函数

 

如果函数传递所有预期的函数,则表示完全应用它了。

 

如果只传递几个参数,并不是全部参数,那么将返回部分应用的函数。

 

 

运行结果如下:

 

7 字符串的格式化输出

文字插值器:f/s

就使用上面部分参数应用函数的代码。其中f s都是一样的效果

8 柯理化

柯里化函数(Curried Function)是把具有多个参数的函数转换为一条函数链,每个节点上是单一参数。

 

 

一个简单的例子:

总结:函数的通用性降低,但是适用性提高

 

9偏函数

被包在花括号内没有match的一组case语句的是一个偏函数。 PartialFunction[A,B]

 A:参数类型

B:返回类型

常用与模式匹配

 

运行结果

 

posted @ 2019-06-11 21:59  大魔王阿黎  阅读(150)  评论(0编辑  收藏  举报