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 }