Scala基础知识之函数

来源:互联网 发布:c语言的库函数 编辑:程序博客网 时间:2024/05/22 22:59

Scala基础知识之函数

使用de定义函数  函数名 (参数列表): 返回类型 = {function body }

这里写图片描述

注意类型Int 必须要首字母大写

这里写图片描述

变量可以推断返回类型,所以函数也可以省略返回值类型

这里写图片描述

再次简化, 变成一行

scala> def max(x:Int, y:Int) = if(x>y) x else ymax: (x: Int, y: Int)Intscala> max(2,3)res30: Int = 3scala>

二、部分应用(Partial application), 默认值

scala> def sum(x:Int, y:Int) = x+ysum: (x: Int, y: Int)Intscala> sum(2,3)res31: Int = 5设置第一个参数为默认值scala> val sum2 = sum(2, _:Int)sum2: Int => Int = <function1>scala> sum2(4)res32: Int = 6

2.1、实现

package com.chb.testobject TestFunc {    def add(x: Int, y: Int) = x + y  //部分应用  def add2 = add(_:Int, 2);  /**   * 主函数   */  def main(args: Array[String]): Unit = {    println(add(2, 3));    //add2只用输入一个参数    println(add2(2));  }}package com.chb.testobject TestFunc {  /**   * 默认参数   */  def sayMyName(name: String = "jack") {    println(name);  }  /**   * 主函数   */  def main(args: Array[String]): Unit = {    sayMyName("name");    sayMyName();//输出默认值  }outputs:    name    jack}

三、递归函数

如果是递归函数,同样需要指定返回类型。如:

scala> def fun(n:Int):Int = if(n<=0) 1 else n*fun(n-1)fun: (n: Int)Intscala> fun(5)res33: Int = 120如果不指定返回值类型scala> def fun(n:Int)= if(n<=0) 1 else n*fun(n-1)<console>:8: error: recursive method fun needs result type       def fun(n:Int)= if(n<=0) 1 else n*fun(n-1)scala>##代码package com.chb.testobject TestFunc {    //递归函数必须有返回值类型  def fun(n:Int):Int = if(n<=0) 1 else n*fun(n-1)  /**   * 主函数   */  def main(args: Array[String]): Unit = {    println(fun(5))  }}

四、柯里化函数

有时会有这样的需求:允许别人一会在你的函数上应用一些参 数,然后又应用另外的一些参数。 例如一个乘法函数,在一个场景需要选择乘数,而另一个场景 需要选择被乘数

scala> def multiply(m:Int)(n:Int):Int = m*nmultiply: (m: Int)(n: Int)Intscala> multiply(2)(3)res36: Int = 6scala>这个看起来没有什么用处啊,但是我们说柯里化在递归,和控制抽象方面比较有用在目前我们不去深究这个使用场景,现在就是让大家知道有这么个形式,大家掌握到这就可以了柯里化就是把参数可以分开来,把部分函数参数可以用下划线来代替package com.chb.testobject TestFunc {    def multiply(m:Int)(n:Int):Int = m*n //第一个参数默认, 第二个参数使用"_"代替  def m2 = multiply(2)_;  /**   * 主函数   */  def main(args: Array[String]): Unit = {    println(m2(3));  }}

4.1、部分应用第二个参数

#第一个参数使用默认3, 第二个参数使用"_"表示scala> val timesTwo = multiply(3)_timesTwo: Int => Int = <function1>scala> timesTwo(3)res37: Int = 9scala>  def adder(m: Int, n: Int) = m + nadder: (m: Int, n: Int)Intscala>  (adder _).curriedres39: Int => (Int => Int) = <function1>

五、匿名函数,没有名字, 没有返回值类型

##匿名函数没有名字scala> (x:Int, y:Int) => x * yres40: (Int, Int) => Int = <function2>#添加上返回值类型, 会报错的。scala> (x:Int, y:Int):Int => x * y<console>:1: error: not a legal formal parameter       (x:Int, y:Int):Int => x * y                     ^scala>

什么是函数式编程

这里写图片描述

函数嵌套

def testinclude(a:Int,b:Int)={     def add(a:Int,b:Int)=a+b;     add(a,b);  }

函数可以赋值给变量

匿名函数scala> (x:Int) => x+1 res43: Int => Int = <function1>函数赋值给变量scala> var inc = (x:Int)=>x+1inc: Int => Int = <function1>scala> inc(10)res44: Int = 11scala>

函数的传递

scala> def test02(callback:() => Unit) = {          callback();      }test02: (callback: () => Unit)Unitscala> var t01 = () =>print("fffffffffff")t01: () => Unit = <function0>scala> test02(t01)fffffffffffscala> test02(()=>{})scala> test02(()=>{})
0 0
原创粉丝点击