Scala中的函数是Java中完全没有的概念,因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只有方法的概念,即寄存和依赖于类和对象中的方法。Java中的方法绝不可能脱离类和对象独立存在。
而Scala是一门即面向对象,又面向过程的语言。因此在Scala中有非常好的面向对象的特性,可以使用Scala来基于面向对象的思想开发大型复杂的系统和工程。而且Scala也是面向过程,因此Scala中有函数的概念。在Scala中,函数和类,对象一样,都是一等公民。Scala中的函数可以独立存在,不需要依赖类和对象。
而Scala是一门即面向对象,又面向过程的语言。因此在Scala中有非常好的面向对象的特性,可以使用Scala来基于面向对象的思想开发大型复杂的系统和工程。而且Scala也是面向过程,因此Scala中有函数的概念。在Scala中,函数和类,对象一样,都是一等公民。Scala中的函数可以独立存在,不需要依赖类和对象。
而Scala的函数式编程,就是Scala面向过程的最好的佐证。也正是因为函数式编程,才让Scala具备了Java不具备的更强大的功能和特性。
下面介绍怎么使用:
-- 1. 将函数赋值给变量
//Scala中的函数时一等公民,可以独立定义,独立存在,而且直接将函数作为值赋值给变量 // Scala的语法规定,将函数赋值给变量时,必须在函数后面加上空格和下划线。 def sayHello(name:String){println("Hello, " + name)} val sayHelloFunc=sayHello _ sayHelloFunc("leo")
-- 2. 匿名函数
//Scala中,函数也可以不需要命名,此时函数称为匿名函数。 //可以直接定义函数之后,将函数赋值给某个变量,也可以将直接定义的匿名函数传入其他函数中。 //语法规则: (参数名 :参数类型) => 函数体 val SayHelloFunc=(name:String ) =>println("Hello ,"+ name)
-- 3. 高阶函数
//Scala中,函数是一等公民,因此可以直接将某个函数传入其他函数,作为参数。 该功能非常强大,也是Java俗不具备的。 //接收其他函数作为参数的函数,也被称为高阶函数 (higher -order function) val sayHelloFunc=(name:String) =>println("Hello ," +name) def greeting(func:(String)=>Unit,name:String ){func(name)} greeting(sayHelloFunc,"leo")
使用如下:
// 高阶函数的另一个功能是将函数作为返回值、
def getGreetingFunc(msg :String) =(name:String )=>println(msg+" , "+name) val greetingFunc=getGreetingFunc("hello") greetingFunc("leo")
首先先定义了一个返回值为 函数的函数getGreetingFunc,然后我们就将其函数的返回值 (返回值为函数)赋值给了变量greetingFunc,这样就得到了一个名为 greetingFunc的函数,然后我们调用greetingFunc函数得到打印结果。
-- 4. 高阶函数的类型推断
// 高阶函数可以自动推断出参数类型,而不需要写明类型;而且对于只有一个参数的函数,可以省去其小括号 // 如果仅有的一个参数在右侧的函数体内只是用一次,则还可以将接受参数省略,并且将参数用_来代替。 def greeting(func:(String) => Unit,name :String){func(name)} greeting( (name:String) => println("Hello, " +name),"leo") greeting( (name) => println("Hello, " +name),"leo") //自动推断类型 greeting( name => println("Hello, " + name),"leo") // 省略小括号 def triple( func:(Int) => Int)={func(3)} triple(3* _)