Scala—— 3.函数

在Scala中,方法和函数几乎可以等同(比如它们的定义、使用、运行机制都是一样的),只是函数的使用方式更加的灵活多样。函数式编程是从编程方式(范式)的角度来谈的,可以这样理解:函数式编程把函数当作一等公民,充分利用函数、只是函数的多种使用方式,在Scala中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量,函数的创建不用依赖于类或者对象,而在Java当中,函数的创建则要依赖于类、抽象类或者接口。在Scala中函数式编程和面向对象编程融合在一起了。

1.函数式编程

函数式编程是一种编程范式(programming paradigm)。
函数式编程属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。
函数式编程中,将函数也当做数据类型,因为也可以接受函数当作输入(参数)和输出(返回值)。
函数式编程中,最重要的就是函数。

2.函数形式

def 函数名([参数名:参数类型],…)[[:返回值类型]=] {

语句…

return 返回值

}

# =表示返回值类型不确定,需要类型推导完成
  def getRes(n1: Int, n2: Int, oper: Char) = {
    if (oper == '+') {
      n1 + n2 //返回
    } else if (oper == '-') {
      n1 - n2
    } else {
      //返回null
      null
    }
  }

A.可以根据函数体最后一行代码自行推断函数返回值类型
def getSum(n1: Int, n2: Int): Int = {
n1 + n2
}
** 最后一个表达式即为函数返回值**
如果函数没有形参,调用时可以不带()

B.如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,这时要明确写成 : 返回值类型 = ,当然,如果什么都不写,即使有return返回值也为()

package hello

/**
 * @author Administrator 
 * @date 2020/2/16 9:29
 */
object Test1 {

  def main(args: Array[String]): Unit = {
    # 输出()
    print(fun1(1, 2))
    # 输出3
    print(fun2(1, 2))
  }

  def fun1(i: Int, j: Int) {
    return i + j
  }

  def fun2(i: Int, j: Int): Int = {
    return i + j
  }
}

C.函数嵌套

object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
 
    def f1(): Unit = { //ok private final
      println("f1")
    }
 
    println("ok~~")
 
    def sayOk(): Unit = { // private final sayOk$1 ()
      println("main sayOk")
 
      def sayOk(): Unit = { //  private final sayOk$2 ()
        println("sayok sayok")
      }
    }
 
  }
 
  def sayOk(): Unit = { //成员
    println("main sayOk")
  }
}

D.函数参数默认值

object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
    println(sayOk("mary"))
  }
 
  //name形参的默认值jack
  def sayOk(name: String = "jack"): String = {
    return name 
  }
}

E.函数带名参数

object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
    //    mysqlCon()
    //    mysqlCon("127.0.0.1", 7777)   //从左到右覆盖
 
    //如果我们希望指定覆盖某个默认值,则使用带名参数即可,比如修改用户名和密码
    mysqlCon(user = "tom", pwd = "123")
 
    //f6("v2")  // (错误)
    f6(p2 = "v2") // (?)
 
  }
 
  def mysqlCon(add: String = "localhost", port: Int = 3306,
               user: String = "root", pwd: String = "root"): Unit = {
    println("add=" + add)
    println("port=" + port)
    println("user=" + user)
    println("pwd=" + pwd)
  }
 
  def f6(p1: String = "v1", p2: String) {
    println(p1 + p2);
  }
 
}

F.递归函数未执行之前是无法推断出来结果类型,在使用时必须有明确的返回值类型

 def f8(n: Int) = { //?错误,递归不能使用类型推断,必须指定返回的数据类型
    if (n < 0)
      1
    else
      n * f8(n - 1)
 
}

G:函数可变参数

//支持0到多个参数
def sum(args : Int*) : Int = {
}
//支持1到多个参数
def sum(n1 : Int, args : Int*) : Int = {
}

3.特殊函数形式过程(procedure)

def f10(name: String): Unit = {
println(name + “hello”)
}
如果函数声明时没有返回值类型,但是有等号(=),可以进行类型推断最后一行代码。这时这个函数实际是有返回值的,该函数并不是过程。

4.惰性函数

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

object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
    lazy val res = sum(10, 20)
    println("-----------------")
    println("res=" + res) //在要使用res 前,才执行
  }
 
  //sum函数,返回和
  def sum(n1: Int, n2: Int): Int = {
    println("sum() 执行了..") //输出一句话
    return n1 + n2
  }
 
}

lazy不能修饰var类型的变量, 不但是在调用函数时,加了lazy,会导致函数的执行被推迟,在声明一个变量时,如果给声明了lazy,那么变量值的分配也会推迟。

————Blueicex 2020/2/15 18:06 [email protected]

发布了58 篇原创文章 · 获赞 0 · 访问量 2098

猜你喜欢

转载自blog.csdn.net/blueicex2017/article/details/104338276
今日推荐