Scala是一门既面向对象,又面向过程的语言。因此在Scala中有非常好的面向对象的特性,可以使用Scala来基于面向对象的思想开发大型复杂的系统和工程;而且Scala也面向过程,因此Scala中有函数的概念。在Scala中,函数与类、对象等一样,都是一等公民。Scala中的函数可以独立存在,不需要依赖任何类和对象。
函数的传递
def main(args: Array[String]): Unit = {
sayhel("wangwei")
}
def sayHello(name:String): Unit ={
println("我的名字是"+name)
}
var sayhel=sayHello _ //函数的传递赋值因为函数是一等公民可以独立定义,独立存在
匿名函数也称之为没有名字的函数可以将函数赋值给某个变量也可以将匿名函数传递给某个函数
var say=(name:String)=>println("很高兴认识你"+name)
高阶函数
可以直接将某个函数传递给其他函数作为参数
def main(args: Array[String]): Unit = {
gethello(sayhellofuc,"wang")
}
//匿名函数
var sayhellofuc=(name:String)=>println("hello"+name)
//参数是一个函数的函数
def gethello(func:(String)=>Unit,name:String){func(name)}
高阶函数的返回值是一个函数
def getGreetingFunc(msg: String) = (name: String) => println(msg + ", " + name)
val greetingFunc = getGreetingFunc("hello")
greetingFunc("leo")
高阶函数的参数省略
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 main(args: Array[String]): Unit = {
triple( x=>x*3)
triple(x=>x*4)
triple(_*3)
}
def triple(func: (Int) => Int) = { func(3) }
* // map: 对传入的每个元素都进行映射,返回一个处理后的元素
* Array(1, 2, 3, 4, 5).map(2 * _)
*
* // foreach: 对传入的每个元素都进行处理,但是没有返回值
* (1 to 9).map("*" * _).foreach(println _)
*
* // filter: 对传入的每个元素都进行条件判断,如果对元素返回true,则保留该元素,否则过滤掉该元素
* (1 to 20).filter(_ % 2 == 0)
*
* // reduceLeft: 从左侧元素开始,进行reduce操作,即先对元素1和元素2进行处理,然后将结果与元素3处理,再将结果与元素4处理,依次类推,即为reduce;reduce操作必须掌握!spark编程的重点!!!
* // 下面这个操作就相当于1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9
* (1 to 9).reduceLeft( _ * _)
*
* // sortWith: 对元素进行两两相比,进行排序
* Array(3, 2, 5, 4, 10, 1).sortWith(_ < _)
函数的闭包--Scala通过为每个函数创建对象来实现闭包,实际上对于getGreetingFunc函数创建的函数,msg是作为函数对象的变量存在的,因此每个函数才可以拥有不同的msg ////msg只是一个局部变量,却在getGreetingFunc执行完之后,还可以继续存在创建的函数之中;greetingFuncHello("leo"),调用时,值为"hello"的msg被保留在了函数体内部,可以反复的使用
def getGreetingFunc(msg: String) = (name: String) => println(msg + ", " + name)
val greetingFuncHello = getGreetingFunc("hello")
val greetingFuncHi = getGreetingFunc("hi")
Currying函数
def sum(a: Int, b: Int) = a + b
sum(1, 1)
def sum2(a: Int) = (b: Int) => a + b
sum2(1)(1)
def sum3(a: Int)(b: Int) = a + b
网友评论