scala函数式编程

可变参数:

  • def f4(str:String*): Unit = {}。

  • 如果除了可变参数还有其他参数,需要将可变参数放在末尾。

  • 可变参数当做数组来使用。

    object test_02_comment {
    def main(args: Array[String]): Unit = {
    def f4(str:String*):Unit={
    println(str)
    }
    f4(“sandrew”)
    f4(“sandrew”,“coco”)
    }
    }

    output:
    ArraySeq(sandrew)
    ArraySeq(sandrew, coco)

参数默认值:

  • def f5(name: String = “alice”): Unit = {}

  • 和C++一样,默认参数可以不传,默认参数必须全部放在末尾。

    object test_02_comment {
    def main(args: Array[String]): Unit = {
    def f4(str:String = “alice”):Unit={
    println(str)
    }
    f4(“sandrew”)
    f4()
    }
    }
    output:
    sandrew
    alice

带名称传参:

  • 调用时带名称。

    object test_02_comment {
    def main(args: Array[String]): Unit = {
    def f6(name: String, age: Int = 20, loc: String = “BeiJing”): Unit = {
    println(s"name ${name}, age ${age}, location ${loc}")
    }

      f6("Bob")
      f6("Alice", loc = "Xi'An")
      f6("Michael", 30)
    }
    

    }
    output:
    name Bob, age 20, location BeiJing
    name Alice, age 20, location Xi’An
    name Michael, age 30, location BeiJing

函数至简原则:

    def f0(name: String) : String = {
      return name
    }

1.省略return,scala会使用函数体最后一行代码作为返回值
    def f0(name: String) : String = {
      name
    }
2.如果函数体中只有一行代码,可以省略{}
	def f0(name: String) : String = name
3.如果返回值类型能够推断出来,那么可以省略: 返回值
	def f0(name: String) = name
	类似于数学中的f(x)=x
4.如果无返回值,则可以省略等号
    def f1(name:String) = {
      println(name)
    }
    def f1(name:String) {
      println(name)
    }
5.如果函数无参,但是声明了参数列表,那么调用时,小括号可以省略
    def f1() : Unit = {
      println("sandrew")
    }
    f1()
    f1 //效果和f1()一样
但是如果声明的时候没有写(),调用的时候也不能加()
    def f1 : Unit = {
      println("sandrew")
    }
    f1() //报错
    f1 //只能用这种方式调用
6.如果不关心名称,只关心处理逻辑,那么函数名(def)可以省略   -》》》即匿名函数
      def f3(name: String): Unit = {
        println(name)
      }
===》
(name:String) => { println(name) }

匿名函数 lambda

(x:Int)=>{函数体}

    val fun = (name: String) => {println(name)}
    fun("sandrew")

匿名函数一般是作为参数输入

object test_02_comment {
  def main(args: Array[String]): Unit = {
    val fun = (name: String) => {println(name)}
    def f(func: String => Unit) : Unit = {
      func("sandrew")
    }
    f(fun) // 与下面等效
    f((name: String) => {println(name)}) 

    //匿名函数的简化原则
    // 1.参数类型可以省略,会根据形参进行自动推导
    f((name) => {println(name)})
    // 2.如果只有一个参数,则()可以省略
    f(name => {println(name)})
    // 3.匿名函数只有一行,则{}可以省略
    f(name => println(name))
    // 4.如果参数只出现一次,则参数省略,且后面参数可以用_代替
    f(println(_))    
    // 5.如果可以推断出,当前出入的println是一个函数体,而不是调用语句,可以省略下划线
    f(println)
  }
}



object test_02_comment {
  def main(args: Array[String]): Unit = {
    // 定义一个二元运算函数,只操作1,2两个数,但是具体运算通过参数传入
    def dualFunc(fun: (Int, Int)=>Int): Int = {
      fun(1, 2)
    }
    val add = (a:Int, b:Int) => a+b
    val minus = (a:Int, b:Int) => a-b
    println(dualFunc(add)) // 3
    println(dualFunc(minus)) // -1
  }
}
    //匿名函数简化
	// 1.不用定义变量,直接在调用处使用匿名函数
    println(dualFunc((a:Int, b:Int) => a+b)) // 3
    println(dualFunc((a:Int, b:Int) => a-b)) // -1

    //2.参数的类型不需要写,因为已经在dualFunc的形参中定义好了
    println(dualFunc((a, b) => a + b)) // 3
    println(dualFunc((a, b) => a - b)) // -1

    //3.因为有两个参数,所以()不能删,由于a和b一次,所以可以用_代替
    println(dualFunc(_ + _)) // 3
    println(dualFunc(_ - _)) // -1

高阶函数

函数作为值传递

    def f(n:Int): Int = {
      println("f调用")
      n+1
    }
    // 1.函数作为值进行传递
    val f1 = f _
    val f2: Int=>Int = f //可以把“ _”省略,因为前面声明了f2的类型
    println(f1) // test_02.test_02_comment$$$Lambda$3/466002798@387c703b
    println(f1(12))
    /*
     f调用
     13*/
    println(f2) // test_02.test_02_comment$$$Lambda$4/33524623@224aed64
    println(f2(35))
    /*
     f调用
     36*/

函数作为函数的参数传递

    def dualOp(op: (Int,Int)=>Int, a:Int, b:Int): Int = {
      op(a,b)
    }

    def add(a:Int, b:Int): Int = {
      a + b
    }
    println(dualOp(add, 12, 35))
    println(dualOp((a, b)=>{a+b}, 12, 35))
    println(dualOp(_+_, 12, 35))

函数作为函数的返回值返回

object test_02_comment {
  def main(args: Array[String]): Unit = {
    def f5(): Int => Unit = {
      def f6(a: Int): Unit = {
        println("f6调用: " + a)
      }
      f6
    }
    println(f5()) // test_02.test_02_comment$$$Lambda$3/225493257@629f0666
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 这本书绝不轻易放过每个知识点,全书包含有大量习题,要求你自己实现 Scala 标准库或者 Scalaz 中的既有功能。所以,当你读完本书,做完习题后,虽然你的应用开发能力并不会直接提升,但你会体会到构建函数式语言和框架时的难点和取舍,从而增进你的框架开发语言设计的能力。   ——ThoughtWorks Lead Consultant 杨博   这本书所讲授的,正是基于 Scala函数式编程基础。基于 Scheme、Haskell 等老牌函数式语言的传统教材的问题在于,相关语言的语法和思维方式与读者现有的知识体系迥异,容易造成较为陡峭的入门门槛。此外,由于这些语言本身的实际应用机会不多,初学者也难以在实战中获得宝贵的直觉和经验。而在 Scala 的帮助下,这本书并不要求你抛开现有的思维方式另起炉灶,它所做的更像是为你现有的思维方式添砖加瓦,从而令你如虎添翼。   ——Spark committer from Databricks 连城   尽管函数式编程在近十多年用得越来越多,但市面上介绍其高阶特性的书却并不多。这本书在这方面是个重要的补充,它不仅仅面向 Scala 程序员,同样面向用任何编程语言开发的程序员,只要你充满好奇心。   ——挖财网首席架构师 王宏江   “让你洞察计算的本质。”   ——Martin Odersky, Scala的作者   “Scala和Java8开发者的函数式编程指南!”   ——William E. Wheeler, TekSystems   “本书向你展示了提升Scala技能的方法和理念,它已超过‘更好的Java’。”   ——Fernando Dobladez, Code54   “里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。”   ——Chris Nauroth, Hortonworks   “边干边学,而非只是阅读。”   ——Douglas Alan、Eli和Edythe L. Broad,哈佛和麻省理工学院

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值