07 详解scala函数编程

1 详解scala函数编程

1-1 函数编程简述

  • 面向对象,解决问题时,将问题拆解成一个一个小问题(形成的对象),分别解决。
  • 函数式编程关心是的问题的解决的方案(封装功能),重点在于函数(功能)函数的入参,出参
  • 函数和java中的method java中的method依赖于某个对象 函数就可以独立声明 他们的一直点 都是对功能的封装
  • scala的语法十分灵活,在任意语法中可以声明其他语法规则

在main函数体外面的源码

 def test(str: String): Unit = {
    //函数提
    println(str)
  }

  def main(args: Array[String]): Unit = {
    test("张三");
  }
  

在main函数体里面的源码

  def main(args: Array[String]): Unit = {
	 def test(str: String): Unit = {
	    //函数提
	    println(str)
	  }
    test("张三");
  }
  

1-2 函数的入参(方法参数)和出参(返回值)

1-2-1 无参 无返回值

def test(): Unit ={
    println("Test")
  }

1-2-2 有参 无返回值

 def test1(s:String): Unit ={
    println(s)
  }

1-2-3 有参 有返回值

def test2(s:String): String ={
    return  s+"......."
  }

1-2-4 无参 有返回值

def test3(): String ={
    return  "张三......."
  }

1-3 scala自动推断功能简述

  • scala可以采用自动推断功能来简化函数的声明
    源码
def test(): Unit ={
    return "张三"
  }
  • 如果将函数体的最后一行代码进行返回,那么return关键字就时可以省略的

源码

def test2(): String ={
    "张三"
  }
  • 如果可以根据函数的最后一行代码进行推断类型,那么函数返回值类型可以省略
    源码
def test3() ={
    "张三"
  }
  • 如果函数体中只有一行代码,大括号可以省略
    源码
def test4() = "张三"
  • 函数声明中没有参数列表,小括号可以省略
  • 声明函数必须要增加def关键字
  • 注意区变量和函数
    源码
  def test5 = "张三"
  val test6 = "张三"
  • 如果明确函数没有返回值 那么等号可以省略,省略后,编译器不会将函数体最后一行代码最为返回值
def test7(){
    "张三"
  }
  • 如果函数没有参数列表,可以省略小括号,调用一定不能使用小括号
  • 如果函数没有参数列表,但是没有省略小括号,调用时可加可不加
    匿名函数
 ()->println("xxxx")

1-4 可变函数

  • 调用函数时,可以传多个参数,也可以不参参数
 def  test(name:String*): Unit ={
      println(name)
    }
    //test("张三","李四")
    test()
  • 在底层中scala根据不同的参数返回对应的返回值

1-5 默认参数

  • 如果希望函数中的某一个函数使用默认值,那么可以声明时直接赋初始值
 def test(name: String , age: Int = 20): Unit ={
      println(s"${name} - ${age}")
    }
    test("张三",11)
    test("张三")
  • 调用函数时,参数匹配规则从前到后,从左到右
def test2(name2 :String = "lishi",name1: String ): Unit ={
      println(s"${name2} - ${name1}")
    }
  • 带名参数 用于指定具体的参数
 test2(name1="zhangsan");

1-6 函数的传递

  • scala 时完全面向函数式编程语言
  • 函数可以赋值给变量
  • 函数可以作为函数的参数
  • 函数可以作为函数的返回值

1-6-1 函数作为返回值

 def main(args: Array[String]): Unit = {
      
        def f(): Unit = {
          println("Fuction")
        }
        def f0()= {
          // 返回函数
          // 直接返回函数,有问题,需要郑家特殊符号:下划线
          f _
        }
        f0()()
       }
  • 上面将 f() 这个函数作为了返回值
  • f0()() 函数调用的过程 第一个()是调用了f0() 这个函数,第二个()是调用返回是f()函数
    -一个函数,加上()就执行返回对应函数
   def f1(i: Int) ={
          def f2(j: Int) ={
            i*j
          }
          f2 _
        }

        val num: Int = f1(2)(3)
        println(num)
  • 这种事有参数情况

1-6-2 函数柯里化

  • 函数柯里化 对返回函数的函数的简化
def f3(i: Int)(j: Int): Int = {
         i * j
     }
     println(f3(2)(3))

1-6-3 闭包

-闭包的理解还是需要下面这个段代码

   def f1(i: Int) ={
          def f2(j: Int) ={
            i*j
          }
          f2 _
        }

        val num: Int = f1(2)(3)
        println(num)
  • 一个函数在实现逻辑时,将外部的变量引入到函数的内容,改变了这个变量的声明周期,称之为闭包

使用匿名函数改善代码

  • 将函数作为参数传递给另外一个函数,需要采用特殊的声明方式
  • 参数列表=> 返回值类型
    def f6(f:()=>Unit): Unit ={
      f()
    }
    f6(()=>{println("xxxxx")})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值