package com.spark.scala.basics
/**
* 1.在scala中,函数式一等公民,可以像变量一样被传递,被赋值,同时函数可以赋值给变量,变量也可以赋值给函数;
* 原因在于:函数背后是类和对象,在运行的时候,函数其实是一个变量,这背后的类是scala自动生成,且可以天然地被序列化和反序列化。
* 意义:
* 1)序列化和反序列化,函数可以在分布式系统上传递;
* 2)可以和普通的变量一样完全,用在普通变量可以用在的地方,比如:参数,返回值等
*
* 2.def关键字来定义函数
* 3.函数会自动类型推断来确定函数返回值的类型,*****注意:函数名称和函数体之间没有等于号的话,则类型推断失效,此时函数的类型是Unit
* 4.函数的的参数可以是函数
* 5.如果函数体中无法推导出函数的类型,则必须声明具体的类型
* 6.可以指定函数的参数名,如 hello(age = 25, name="Scala"),原因在于函数背后其实是类,其参数就是类的成员,所以顺序啥的无所谓!
* 7.函数可变参数,如sum()函数,传参时语法是:_*
* 8.可变参数中的数据其实会被收集成为Array数据,我们在入口方法main中其实就是可变参数,是以Array[String]的方式呈现的
*/
object HelloFunctionProgramming {
def main(args:Array[String]): Unit = {
hello("Scala", 25)
println(hello("Scala", 25)) //函数作为参数
hello(age = 25, name="Scala")
println("sum = " + sum(1,2,3,4,5,6))
println("sum = " + sum(1 to 6: _*)) //调用可变参数
}
def hello(name: String, age: Int = 25): Int = { // 默认参数
println("Hello, My name is " + name + "! My age is " + age + "!")
age
}
def sum(numbers: Int*) = { // 函数可变参数
var result = 0
for (number <- numbers) result += number
result
}
}
/**
* Functional style:
*
* 1.函数和变量一样,函数可以直接赋值给变量
* 2.匿名函数
* 3.函数作为参数,传递给函数,称为高阶函数
* 4.函数的返回值是函数,此时,实现了闭包的功能(closure)
* closure的原理;参数都是对象的成员,所以可以一直访问
*/
object FunctionalProgramming {
def main(args: Array[String]): Unit = {
val hiData = bigData _
// hiData("Scala")
val f = (name: String) => println("Hi, " + name)
// f("Kafka")
def getName(func: String => Unit, name: String): Unit = {
func(name)
}
// getName(f, "Scala")
// Array(1 to 10: _*).map{ (item: Int) => 2 * item}.foreach(println(_))
def funcResult(message: String) = (name: String) => println(message + name)
//def funcResult(message: String, name: String) {println(message + " : " + name)}
funcResult("Hello ")("Java")//currying函数的写法
val result = funcResult("Hello ")
result("Java")
}
def bigData(name: String): Unit = {
println("Helllo " + name)
}
}