Scala中的函数

来源:互联网 发布:淘宝秒杀流程 编辑:程序博客网 时间:2024/05/06 18:39
package Basic

/**
 * 函数可以被简单的认为是:包括了一条或者几条语句的代码体,该代码体接收若干参数,
 * 经过代码体处理后返回结果,例如f(x)=x+1
 * 在Scala中函数是一等公民,可以向变量一样被传递、被赋值,同时函数可以赋值给变量,变量也可以赋值给函数,之所以可以是这样,原
 * 因在于函数背后是类和对象,也就是说在运行的时候函数其实是一个变量!!!当然,这背后的类是Scala语言自动帮助我们生成的,且可以
 * 天然的序列化和反序例化,这个意义非常重要:
 * 意义1:可以天然的序列化和反序例化的直接好处就是函数可以分布系统上递!
 * 意义2:因为函数背后基实是类和对象,所以可以和普通的变量完全一样的应用的任何普通变量可以运用的地方,包括作为参数递、作为
 * 返回值、被变量赋值和赋值给变量等。
 * 补充:整个IT编程技术发展史,其实就是一部封装史:
 * 1、Function时代:在C语言中提供了函数的概念,用函数把若干条语句进行封装与复用
 * 2、Class时代:在C++和Java等语言中提供了类和对象,把数据和处理数据的业务逻辑封装起来
 * 3、框架时代:把数据、代码和驱动引擎封装起来,是过去10年和未来10年IT技术的核心
 * 
 * 关于函数初级入门的几个要点:
 * 1、def关键字来定义函数;
 * 2、函数会自动进行类型推断来确定函数返回值的类型 。如果函数名称和函数体之间没有等于号"="的话,类型推断失效,此时函数的类型是Unit
 * 3、函数的参数可以是函数
 * 4、如果在函数体中无法推导出函数的类型,则必须声明具体的类型,例如下面的fibonacci。
 * 5、函数的参数可以有默认值,这样在调用函数的时候,如果不想改变默认值的话,就直接不传递该参数而是直接使用默认值即可,
 * 这在实际的编程中意义重大,尤其中在Spark等框架中,因为框架一般都有自己的默认配置和实现,此时我们就可以非常好的使用默认值。
 * 6、我们可以基于函数的参数名称来调整函数的传递参数的顺序,重点在于为什么可以这么做呢? 原因在于函数背后其实是类,其参数就是类
 * 的成员,所以无所谓顺序。
 * 7、函数中如果不确定传递参数的个数,可以使用变长参数的方式:传参时候一个方便的语法:  : _*
 * 8、可变参数中的数据其实会被收集成为 Array数组,我们在入口方法main中其实就是可变参数,是以Array[String]方式呈现的;
 * 
 */
object HelloFunctionProgramming {
  def main(args: Array[String]): Unit = {
    hello("张三", 20)
    println(hello("李四", 22))
    println("fibonacci of 5 = " +fibonacci(5))
    
    hello(age=31, name="Spark")
//    hello("Scala")
    println(sum(1,2,3,4,5))
    println(sum(1 to 5: _*)) //语法为:1 to 10: _*  冒号空格下划线星号
    println(sumrecursive(1 to 5: _*))
  }
  def hello(name:String,age:Int)={
    println("My name is "+name)
    println("My age is "+age)
    age
    name
  }
  /**
   * 斐波那契数例
   * 递归的方式必须明确指明函数的返回值类型 
   */
  def fibonacci(n:Int):Int={
    if(n==1 || n==2) 1
    else fibonacci(n-1)+fibonacci(n-2)
  }
  //可变参数
  def sum(nums:Int*)={
    var result=0
    for(num <- nums) result+=num
    result
  }
  def sumrecursive(nums:Int*):Int={
    if(nums.length==0) 0
    else nums.head+sumrecursive(nums.tail: _*)
  }
  
}
0 0