Scala编程

Scala编程详解13:函数式编程

2020-05-26  本文已影响0人  勇于自信

Scala中的函数是Java中完全没有的概念。因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只有方法的概念,即寄存和依赖于类和对象中的方法。Java中的方法是绝对不可能脱离类和对象独立存在的。
而Scala是一门既面向对象,又面向过程的语言。因此在Scala中有非常好的面向对象的特性,可以使用Scala来基于面向对象的思想开发大型复杂的系统和工程;而且Scala也面向过程,因此Scala中有函数的概念。在Scala中,函数与类、对象等一样,都是一等公民。Scala中的函数可以独立存在,不需要依赖任何类和对象。
Scala的函数式编程,就是Scala面向过程的最好的佐证。也正是因为函数式编程,才让Scala具备了Java所不具备的更强大的功能和特性。
而之所以Scala一直没有替代Java,是因为Scala之前一直没有开发过太多知名的应用;而Java则不一样,Java诞生的非常早,上个世界90年代就诞生了,基于Java开发了大量知名的工程。而且最重要的一点在于,Java现在不只是一门编程语言,还是一个庞大的,涵盖了软件开发,甚至大数据、云计算的技术生态,Java生态中的重要框架和系统就太多了:Spring、Lucene、Activiti、Hadoop等等。
大纲:
1、将函数赋值给变量
2、匿名函数
3、高阶函数
4、高阶函数的类型推断
5、Scala的常用高阶函数
6、闭包
7、SAM转换
8、Currying函数
9、return

1、将函数赋值给变量

object scala_demo09 {
  def main(args: Array[String]): Unit = {
    def sayHello(name: String) { println("Hello, " + name) }
    val sayHelloFunc = sayHello _
    sayHelloFunc("leo")
  }
}

输出
Hello, leo

2、匿名函数
val sayHelloFunc = (name: String) => println("Hello, " + name)
3、高阶函数
val sayHelloFunc = (name: String) => println("Hello, " + name)
def greeting(func: (String) => Unit, name: String) { func(name) }
greeting(sayHelloFunc, "leo")

Array(1, 2, 3, 4, 5).map((num: Int) => num * num)

输出:
Hello, leo


object scala_demo09 {
  def main(args: Array[String]): Unit = {
    val greetingFunc = getGreetingFunc("hello")
    greetingFunc("leo")
  }

  def getGreetingFunc(msg: String) = (name: String) => {
    println(msg + ", " + name)
  }
}

输出:
hello, leo

4、高阶函数的类型推断

object scala_demo09 {
  def main(args: Array[String]): Unit = {
    greeting((name: String) => println("Hello, " + name), "leo")
    greeting((name) => println("Hello, " + name), "leo")
    greeting(name => println("Hello, " + name), "leo")
    println(triple(3 * _))
  }
  def greeting(func: (String) => Unit, name: String) { func(name) }
  def triple(func: (Int) => Int) = { func(3) }
}

输出:

Hello, leo
Hello, leo
Hello, leo
9
5、Scala的常用高阶函数
6、闭包
def getGreetingFunc(msg: String) = (name: String) => println(msg + ", " + name)
val greetingFuncHello = getGreetingFunc("hello")
val greetingFuncHi = getGreetingFunc("hi")
7、SAM转换

object scala_demo09 {
  def main(args: Array[String]): Unit = {
    import javax.swing._
    import java.awt.event._

    val button = new JButton("Click")
    button.addActionListener(new ActionListener {
      override def actionPerformed(event: ActionEvent) {
        println("Click Me!!!")
      }
    })
    //做隐式转换
    implicit def getActionListener(actionProcessFunc: (ActionEvent) => Unit) = new ActionListener {
      override def actionPerformed(event: ActionEvent) {
        actionProcessFunc(event)
      }
    }
    //如果不做隐式转换,下面代码就会报错
    button.addActionListener((event: ActionEvent) => println("Click Me!!!"))

  }
}

8、Currying函数

object scala_demo09 {
  def main(args: Array[String]): Unit = {
    println(sum(1,1))
    println(sum2(1)(1))
    println(sum3(1)(1))
  }
  def sum(a: Int, b: Int) = a + b
  def sum2(a: Int) = (b: Int) => a + b
  def sum3(a: Int)(b: Int) = a + b
}

9、return
def greeting(name: String) = {
  def sayHello(name: String):String = {
    return "Hello, " + name
  }
  sayHello(name)
}
上一篇 下一篇

猜你喜欢

热点阅读