Scala函数初级入门的几个要点

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

猜你喜欢

转载自blog.csdn.net/superiorpengFight/article/details/54315804
今日推荐