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 }