Scala函数式编程(一)

基本语法

[修饰符] def 函数名 (参数列表) : [:返回值类型] = {
函数体
}
private def test ( s : String ) : Unit = {
println (s)
}

函数与方法的区别

scala方法是类的一部分,函数是一个对象,可以赋值给一个变量。即在类中定义商务函数都是方法。scala与java类似,方法是组成类的一部分,scala中的函数则是一个完整的对象。声明在类中的函数称之为方法,所以类中的函数就应该符合方法的约束:重写和重载。函数没有重写和重载的概念。
方法就是函数,函数可以声明在任意地方:函数中可以声明函数,方法中也可以声明函数。
函数中无法声明方法,方法中也不能声明方法,函数有作用域,只能在当前的作用域中使用。
方法也有作用域,在当前类中可以任意使用,在类的外部可以访问权限,对象的调用来访问。

函数的定义

package com.atguigu.chapter03

object Scala2 {
  def main(args: Array[String]): Unit = {
    //Scala是一个完全的函数式语言,万物皆函数
    //函数式scala语言中非常重要的一个语法结构
    //1.函数式编程重要的是函数的名字,输入的参数和输出的结果

    //TODO Function -函数声明和使用

    //TODO 1.无参,无返回值
    def fun1():Unit={
      println("fun1...")
    }
    //函数的调用
    //函数名(参数)
    fun1()
    //如果函数声明时没有参数,调用时小括号可以省略
    fun1

    //TODO 2.无参,有返回值
    def fun2():String  ={
      return "zhangsan"
    }

    println(fun2())
    val s=fun2()
    println(s)

    //TODO 3.有参,无返回值
    //参数的声明方式=>参数名:参数类型,此时参数类型不能省略
    def fun3(name:String): Unit ={
      println("Name="+name)
    }
    fun3("zahngsan")//如果函数声明了参数,调用时必须传递参数
    //方法的参数传递是:值传递
    //值传递:方法参数传递,传递的就是参数的值,基本数据类型,值是多少那么传的就是多少
    // 如果参数为引用类型,传递的依然是值,这里的值其实是引用类型数据的内存地址


    //TODO 4.有参,有返回值
    def fun4(name:String): String ={
      return "Name="+name
    }
    val s1=fun4("zahngsan")
    println(s1)

    //TODO 5.多参,无返回值
    //多个参数之间用逗号分割
    def fun5(name:String,age: Int): Unit ={
      println(s"Name=${name},Age=${age}")
    }
    fun5("zhangsan",20)
    //如果函数声明中有多个参数 那么调用时参数数量匹配,且按照声明顺序进行赋值和匹配

    //TODO 6.多参,有返回值
    def fun6(name:String,age:Int): String ={
      return "Name="+name+"Age="+age
    }
    //参数不能多传
    val s2 =fun6("zhangsan",20)
    println(s2)

    //TODO 7.函数参数的个数 (没有约束)
    def fun7(
          //25个参数....

            ): Unit ={
      println("fun7")
    }
    fun7()


  }

}

函数的参数

package com.atguigu.chapter03

object Scala3 {
  def main(args: Array[String]): Unit = {
    //TODO 动态参数 -可变参数
    //参数可以根据传值自动发生变化
    //需要将参数声明时,类型后面增加特殊符号:* 这里的星号表示多(动态)
    //传值的时候可以传递一个参数或多个参数甚至不传
    //所谓的动态参数,其实就是参数的类型集合
    def fun1(name:String*): Unit ={
      println(name)
    }
//    val s ="zahngsan" * 2
//    println(s)
    fun1("zhangsan")
    fun1("zhangsan","lisi","hauhua")

     //如果参数列表中含有可变参数,那么这个可变参数应该放置在列表的最后声明
    //一个函数不允许声明多个可变参数的
    def fun11(age:Int,name:Any*): Unit ={

    }
    fun11(20,"zhangsan",10)

    //TODO 参数的默认值
    //默认情况下,函数的参数是使用val声明的,所以不能修改
    //为了解决参数不能修改的问题,scala提供了一个参数默认值得语法,声明参数的时候直接提供默认值
    //声明参数的时候,同时提供默认值,那么在调用函数时,如果函数不传递参数,那么就自动使用默认值
    def fun2(password:String="000000"): Unit ={
//      if(password==null || password==""){
//        password="000000"
      println(password)
      }
    fun2("123123")//没传就用0000000.传了就用123123
    fun2()

    //TODO 带名参数
    def fun3(password:String="000000",loginacct:String): Unit ={
      println("Acc:"+loginacct +"Pswd:"+ password)
    }
    //如果想要改变传值的顺序,需要采用特殊的语法操作:带名参数
    //在函数调用传值的时候,把参数的名称带上
    fun3(loginacct = "zhangsan")
    }
}

函数至简原则

package com.atguigu.chapter03

object Scala4 {
  def main(args: Array[String]): Unit = {
    //TODO 函数式编程 至简原则
    //scala函数式编程中有一个重要的原则:至简原则
    //这里的简表示简单,函数式编程能省则省
    def test(): String = {
      return "zahngsan"
    }

    //val s=test()
    val s = test
    println(s)

    //1.函数明确有返回值,那么函数体中的return关键字可以省略
    // 满足条件的最后一行代码执行结果为表达式的返回值
    def test1(): String = {
      "zhangsan"
    }

    //2.如果能够通过返回值推断出函数的返回值类型,那么返回值类型可以省略
    //以后写函数时 尽量不要写返回值类型,最好由编译器自动推断
    //多态的时候不能省略
    def test2() = {
      val age = 30
      if (age < 16) {
        16
      } else {
        println()
      }
    }

    //3.如果参数列表中没有参数,声明时小括号可以省略
    def test3: Unit = {
      println("zhangsan")
    }
    //test3() 如果函数没有声明参数列表,那么调用函数时,为了统一也不能增加参数列表的小括号
    test3

    //4.如果函数的逻辑代码只有一行,那么大括号可以省略
    def test4(): Unit = println("zhangsan")

    test4()

    //融合以上四种简化情况
    //    def test5(): String ={
    //      return "zhangsan"
    //    }

    //    def test5(): String ={
    //      "zhangsan"
    //    }

    //    def test5()={
    //      "zhangsan"
    //    }

    //    def test5={
    //      "zhangsan"
    //    }

    //scala中函数和变量必须通过关键字来区分
    def test5 = "zhangsan"

    val test55 = "lisi"

    println(test5)
    println(test55)

    //6.将unit和等号同时省略,函数没有返回值
    //如果一个函数明确没有返回值,那么函数体中有return不起作用
    //如果省略返回值类型,那么函数体中有return会发生错误
    //希望unit返回值类型可以省略,而且同时函数体中也不用返回结果,这时可以将unit和等号同时省略
    //在这种场景下,return仅仅起到了改变了流程的作用

//    def test6(): Unit = {
//      return "zhangsan"
//    }

    def test6() {
      return "zhangsan"
    }
    println(test6())

    //7.函数的名称和关键字也可以省略
    //当关键字和函数名省略后,返回值类型也应该同时省略
    //需要将等号改为颜文字:=>
     //如果函数声明时没有名字和关键字,称为匿名函数
    //test(x:Int, y:Int) => x+y
    //multi(x:Int, y:Int) => x*y
//    def test7(): Unit ={
//      println("test7...")
//    }
//    test7()

    () => {
      println("test7...")
    }
    //大括号可以理解为代码块
    //小括号表示unit,没有值
      //匿名函数不能直接调用,需要将函数赋值给变量使用

      val f=() =>{
        println("test7...")
      }
      //此时变量就是一个函数,所以变量就可以调用了
      f()

  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值