scala:函数式编程基础

函数式编程基础

  • 函数定义/声明
  • 函数运行机制
  • 递归//难点 [最短路径,邮差问题,迷宫问题, 回溯]
  • 过-程
  • 惰性函数和异常

函数式编程高级

  • 值函数(函数字面量)
  • 高阶函数
  • 闭包
  • 应用函数
  • 柯里化函数,抽象控制…
学习scala的注意事项:

在scala中,函数式编程和面向对象编程融合在一起,学习函数式编程式需要oop的知识,同样学习oop需要函数式编程的基础。
在学习Scala中将方法、函数、函数式编程和面向对象编程明确一下:

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

在学习Scala中将方法、函数、函数式编程和面向对象编程关系分析图:
在这里插入图片描述

函数注意事项和细节讨论
  • 函数的形参列表可以是多个, 如果函数没有形参,调用时 可以不带()

  • 形参列表和返回值列表的数据类型可以是值类型和引用类型。

  • Scala中的函数可以根据函数体最后一行代码自行推断函数返回值类型。那么在这种情况下,return关键字可以省略

  • 因为Scala可以自行推断,所以在省略return关键字的场合,返回值类型也可以省略

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

  • 如果函数明确声明无返回值(声明Unit),那么函数体中即使使用return关键字也不会有返回值

object fuctionretureDemo {
  //有= 的话不可以写return
  def sum(n1 : Int,n2 : Int) ={
//    return n1 + n2
  }
  //有返回值的话那么可以写rerurn也可也不写return
  def sum1(n1 : Int,n2 : Int): Int = {
    return n1 + n2
  }
  //如果啥都不写的话那么也可以return,默认没有返回值类型,就算写了return也无效
  def sum2(n1 : Int,n2 :Int){
    return n1 + n2
  }
  //如果是Unit = 的话那么和上面的情况一样。没有返回值
  def sum3(n1 : Int,n2 : Int): Unit ={
    return n1 + n2
  }

}
  • 如果明确函数无返回值或不确定返回值类型,那么返回值类 型可以省略(或声明为Any)
 def f3(s: String) = {
    if(s.length >= 3)
      s + "123"
    else
      3}
def f4(s: String): Any = {
    if(s.length >= 3)
      s + "123"
    else
      3}
  • Scala语法中任何的语法结构都可以嵌套其他语法结构(灵活),即:函数中可以再声明/定义函数,类中可以再声明类 ,方法中可以再声明/定义方法
object fuction06 {
 def main(args: Array[String]): Unit = {

   def sayHi(): Unit ={
     println("say he")
     def sayHi(): Unit ={
       println("say he")
     }
   }
     
   
 }
 def sayHi(): Unit ={
   println("say he")
 }

   
}
  • Scala函数的形参,在声明参数时,直接赋初始值(默认值),这时调用函数时,如果没有指定实参,则会使用默认值。如果指定了实参,则实参会覆盖默认值。
  def name(name : String = "Jack"): String ={
    return name + "ok"
  }
  • 如果函数存在多个参数,每一个参数都可以设定默认值,那么这个时候,传递的参数到底是覆盖默认值,还是赋值给没有默认值的参数,就不确定了(默认按照声明顺序[从左到右])。在这种情况下,可以采用带名参数
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)
}
  mysqlCon()
  mysqlCon("127.0.0.1",777)
  mysqlCon(user = "tom",pwd = "123")
发布了81 篇原创文章 · 获赞 12 · 访问量 4047

猜你喜欢

转载自blog.csdn.net/qq_43141726/article/details/104093594