函数介绍

 

  • scala语言

Scala语言是一个完全面向对象编程语言。万物皆对象

Scala语言是一个完全函数式编程语言。万物皆函数

 

  • 函数和方法的区别

函数:为完成某一功能的程序指令(语句)的集合,称为函数。

方法:类中的函数称之方法。

 

函数声明

 

  • 函数声明

(1)函数1:无参,无返回值

(2)函数2:无参,有返回值

(3)函数3:有参,无返回值

(4)函数4:有参,有返回值

(5)函数5:多参,无返回值

 

  • 实例

  •  
object FuncDeclare {  def main(args: Array[String]): Unit = {
// 函数1:无参,无返回值 def test(): Unit = { println("无参,无返回值") }
test()
// 函数2:无参,有返回值 def test2(): String = { "无参,有返回值" }
println(test2())
// 函数3:有参,无返回值 def test3(s: String): Unit = { println(s) }
test3("有参,无返回值")
// 函数4:有参,有返回值 def test4(s: String): String = { s + "有参,有返回值" }
println(test4("有参,有返回值 "))

// 函数5:多参,无返回值 def test5(name: String, age: Int): Unit = { println(s"$name, $age") }
test5("多参", 40) }}

 

Scala 函数式编程_默认值

 

函数参数

 

  • 说明

(1)可变参数

(2)如果参数列表中存在多个参数,那么可变参数一般放置在最后

(3)参数默认值

(4)带名参数

 

  • 实例

  •  
object FuncTest {  def main(args: Array[String]): Unit = {
// (1)可变参数 def test( s : String * ): Unit = { println(s) }
test("Hello", "Scala") test()
// (2)如果参数列表中存在多个参数,那么可变参数一般放置在最后 def test2( name : String, s: String* ): Unit = { println(name + "," + s) }
test2("参数", "可变参数1","可变参数2")
// (3)参数默认值 def test3( name : String, age : Int = 30 ): Unit = { println(s"$name, $age") }
// 如果参数传递了值,那么会覆盖默认值 test3("参数默认值", 20)
// 如果参数有默认值,在调用的时候,可以省略这个参数 test3("参数默认值")

def test4( sex : String = "男", name : String ): Unit = { println(s"$name, $sex") }
// scala函数中参数传递是,从左到右 // 一般情况下,将有默认值的参数放置在参数列表的后面 //test4("带名参数")
//(4)带名参数 test4(name="带名参数")
}}

 

Scala 函数式编程_函数体_02

 

函数至简原则

 

函数至简原则:能省则省

 

(1)return可以省略,Scala会使用函数体的最后一行代码作为返回值

(2)返回值类型如果能够推断出来,那么可以省略

(3)如果函数体只有一行代码,可以省略花括号

(4)如果函数无参,则可以省略小括号

        若定义函数时省略小括号,则调用该函数时,也需省略小括号

        若定时函数时未省略,则调用时,可省可不省

(5)如果函数明确声明Unit,那么即使函数体中使用return关键字也不起作用

(6)Scala如果想要自动推断无返回值,可以省略等号

(7)如果不关心名称,只关系逻辑处理,那么函数名(def)可以省略

(8)如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,需要声明返回值类型

 

  •  
object FuncTest {  def main(args: Array[String]): Unit = {         // 0)函数标准写法    def f1(s: String): String = {      return s + " 函数标准写法"    }      println(f1("Hello"))
//(1) return可以省略,scala会使用函数体的最后一行代码作为返回值 def f2(s: String): String = { s + " return可以省略"    }     println(f2("Hello"))
// 如果函数名使用return关键字,那么函数就不能使用自行推断了,需要声明返回值类型 /* def f2(s:String)={ return "Hello" }*/
//(2)返回值类型如果能够推断出来,那么可以省略 def f3(s: String) = { s + " f3"    }     println(f3("f3"))
//(3)如果函数体只有一行代码,可以省略花括号 //def f4(s:String) = s + " Hello" //def f4(s:String) = "Hello"    def f4() = " f4()"    // 如果函数无参,但是声明参数列表,那么调用时,小括号,可加可不加。 println(f4()) println(f4)
//(4)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略 def f5 = "f5"    // val f5 = "Hello"    println(f5)
//(5)如果函数明确声明unit,那么即使函数体中使用return关键字也不起作用 def f6(): Unit = { //return "abc" "Hello"    }    println(f6())
//(6)scala如果想要自动推断无返回值,可以省略等号 // 将无返回值的函数称之为过程 def f7() { "Hello"    }    println(f7())
//(7)如果不关心名称,只关系逻辑处理,那么函数名(def)可以省略 //()->{println("xxxxx")}    val f = (x: String) => x + "Hello"     // 万物皆函数 : 变量也可以是函数 println(f("f()"))
//(8)如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,需要声明返回值类型 def f8(): String = { return "f8()"    }   println(f8())
}}

 

Scala 函数式编程_值类型_03

 

高阶函数

 

  • 说明

定义:参数为函数的函数称为高阶函数

 

  • 案例实操

  •  
object FuncTest {  def main(args: Array[String]): Unit = {
//高阶函数————函数作为参数 def calculator(a: Int, b: Int, operater: (Int, Int) => Int): Int = { operater(a, b) }
//函数————求和 def plus(x: Int, y: Int): Int = { x + y }
//方法————求积 def multiply(x: Int, y: Int): Int = { x * y }
//函数作为参数 println(calculator(2, 3, plus)) println(calculator(2, 3, multiply)) }}

 

Scala 函数式编程_scala_04

 

匿名函数

 

没有名字的函数就是匿名函数,可以直接通过函数字面量(表达式)来设置匿名函数

  •  
object FuncTest {  //高阶函数————函数作为参数  def calculator(a: Int, b: Int, operator: (Int, Int) => Int): Int = {    operator(a, b)  }    //函数————求和  def plus(x: Int, y: Int): Int = {    x + y  }    def main(args: Array[String]): Unit = {
//函数作为参数 println(calculator(2, 3, plus))
//匿名函数作为参数 println(calculator(2, 3, (x: Int, y: Int) => x + y))
//匿名函数简写形式 println(calculator(2, 3, _ + _)) }}

 

Scala 函数式编程_函数体_05

 

函数柯里化&闭包

 

  • 说明

函数柯里化:将一个接收多个参数的函数转化成一个接受一个参数的函数过程,可以简单的理解为一种特殊的参数列表声明方式。

闭包:就是一个函数和与其相关的引用环境(变量)组合的一个整体(实体)

 

  • 实例

  •  
object FuncTest {  def main(args: Array[String]): Unit = {    //外部变量    var x: Int = 10      //闭包    def f( y: Int): Int = {      x + y    }    // 40    println(f(30))  }}
  •  
object FuncTest {
  val sum = (x: Int, y: Int, z: Int) => x + y + z  val sum1 = (x: Int) => { y: Int => { z: Int => { x + y + z } }  }  val sum2 = (x: Int) => (y: Int) => (z: Int) => x + y + z  def sum3(x: Int)(y: Int)(z: Int) = x + y + z    def main(args: Array[String]): Unit = {   sum(1, 2, 3) sum1(1)(2)(3) sum2(1)(2)(3)    sum3(1)(2)(3)   }}

 

控制抽象

 

Scala中可以自己定义类似于if-else,while的流程控制语句,即所谓的控制抽象。

scala中,以下结构称为代码块(block),可视为无参函数,作为 =>Unit类型的参数值。

  •  
{code}

 

  •  
object FuncTest {   def loop(n: Int)(op: => Unit): Unit = {    if (n > 0) {      op      loop(n - 1)(op)    }  }
def main(args: Array[String]): Unit = { loop(5) { println("test")    }     }}

 

Scala 函数式编程_scala_06

 

惰性函数

 

  • 说明

当函数返回值被声明为lazy时,函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。这种函数我们称之为惰性函数

  • 案例实操

  •  
object FuncTest {
def main(args: Array[String]): Unit = {
lazy val res = sum(10, 30) println("----------------") println("res=" + res) }
def sum(n1: Int, n2: Int): Int = { println("sum被执行。。。") return n1 + n2 }}

 

Scala 函数式编程_scala_07

 

注意:lazy不能修饰var类型的变量

 

Scala 函数式编程_可变参数_08