1 package com.dtspark.scala.basics 2 3 object functionalProgramming { 4 def main(args: Array[String]): Unit = { 5 /** 6 * 函数和变量一样可以直接赋值给变量 7 * 8 */ 9 val hiData = hiBigData _ 10 hiData("Spark") 11 /** 12 * 函数更常使用的是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 13 * 如果你要是用的话,一般会把这个匿名函数赋值给一个变量(其实是val常量) 14 * 表现形式——(传入参数)=>{方法体} 15 */ 16 val f = (name:String)=>println("Hi,"+name) 17 f("kafka") 18 19 /** 20 * 函数也可以作为一个参数传给函数,这极大的简化了编程的语法 21 * 以前Java的方式是new一个接口实例,并且在接口实例的回调方法callback中来实现业务逻辑, 22 * 这种方式是高阶函数编程方式 23 * 函数作为参数的表现形式——函数名:传入参数*=>返回值 24 */ 25 def getName(func:String=>Unit,name:String){ 26 func(name) 27 } 28 getName(f,"Scala") 29 /** 30 31 * 把数组中每个数乘以2再打印出来 32 */ 33 Array(1 to 10:_*).map { item:Int => item*2 }.foreach { x => println(x) } 34 /** 35 * 函数的返回值也可以是函数 36 * 下面是函数的返回值是函数的列子,这里面表明Scala实现了闭包 37 * 闭包的内幕:Scala的函数背后是类和对象,所以Scala的参数都作为了对象的成员,后续可以继续访问,这就是其闭包的原理 38 * 39 * currying,复杂的函数式编程中经常使用,可以维护变量在内存中的状态,且实现返回函数的链式功能,可以实现非常复杂的算法和逻辑 40 */ 41 def funcResult = (name:String)=>println(name) 42 funcResult("java") 43 //currying函数写法 44 def funcResult1(message:String) = (name:String)=>println(message+" : "+name) 45 //原先写法 def fimcResult1(message:String,name:String){println(message+" : "+name)} 46 funcResult1("Hello")("Java") 47 val result = funcResult1("Hello")//与前面的调用方法相同 48 result("java") 49 50 51 } 52 53 def hiBigData(name:String){ 54 println("Hi,"+name) 55 } 56 }