Scala(三)【函数式编程】

一.方法和函数

1.方法

1)基本语法

def 方法名(参数名:参数类型,...):返回值类型 = {方法体}

示例

  def add(x: Int, y: Int): Int = {
    x + y
  }
2)简化原则

1、方法体中只有一行语句的时候,{ }可以省略

示例

  def add(x: Int, y: Int): Int = x + y

2、如果将方法体中最后一行表达式作为方法的返回值,返回值类型可以省略

示例

  def add(x: Int, y: Int) = {
    x + y
  }

注意

​ 方法体中有return,必须定义方法的返回值类型
​ 递归方法必须定义返回值类型

3、如果方法不需要返回值, =可以省略

示例

  def func(x: Int) {
    print(x)
  }

4、如果方法不需要参数,()可以省略

示例

  def func1 = {
    print("hello world")
  }

注意

​ 如果定义方法的时候,没有(),在调用的时候也不能带上()

​ 如果定义方法的时候有(),调用方法的时候()可有可无

​ =、()、{}不能够同时省略

3)方法参数

1.默认参数

在定义方法的时候,可以给参数一个默认值,后续在调用方法的时候,有默认值的参数就可以不用传参

示例

  def add(y: Int,x: Int = 2, y: Int = 3) = {
    x + y + z
  }
	//不赋值使用默认值
	add(3)

2.带名参数

指定将值传递给哪个参数

   add(x=3,y=4)

3.可变参数

定义func,address参数可变

  def func(name:String,address:String*) ={
    print(s"name:${name},address:${address}")
  }

调用可以函数,不能直接传递数组,要通过 数组名:_* 的形式传递

  val arr = List("北京市","丰台区","槐房村")
  func("zhangsan",arr:_*)
  add(x=3,y=4)

注意

可变参数必须放在参数列表的最后

可变参数不能与默认值、带名参数一起使用

2.函数

语法: val 函数名 = (参数名:参数类型,..) => {函数体}

简化: 函数体中只有一行语句的时候,{}可以省略

示例

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

3.方法和函数的区别

1)方法可以重写,函数不可用重写

2)方法是存在于方法区,函数存在堆中

3)方法可以转成函数,函数不能转成方法。

​ 方法转函数: 方法名 _

 // add方法
 def add(x: Int = 2, y: Int = 3) = {
    x + y
  }
  //将add方法转fun函数
  val fun = add _ 

但是在Scala中,函数和方法没有明确的界定:方法就是函数,函数也是对象

二.高阶函数

定义:方法/函数参数/返回值 是一个函数

示例

  def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
    fun2(x,y)
  }
  // 定义函数
  val add = (x:Int,y:Int) => x+y
  // 调用高阶函数fun1
  println(fun1(1, 2, add))

三.匿名函数

定义:没有名字的函数,一般作为值进行传递

示例

  def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
    fun2(x,y)
  }
  //_+_: 简写(x:Int,y:Int)=>(x=y)
  fun1(1,2,_+_)

四.柯里化

定义: 有多组参数列表的方法称之为柯里化方法

示例

def m1(x:Int)(y:Int,z:Int) = x+y+z

演变过程

  def fun1(x:Int):(Int,Int) => Int ={
    (y:Int,z:Int) => x +y+z
  }
  
  fun1(1)(2,3)

五.闭包

定义: 函数体中使用不属于函数本身的变量,这样的函数称之为闭包

示例

val x = 10
val func = (y:Int) => x+y
原文地址:https://www.cnblogs.com/wh984763176/p/13361127.html