package com.bigdata
//
/** Scala 方法和函数:Scala中既有函数也有方法,大多数情况下我们都可以不去理会他们之间的区别。
*
* 方法:Scala 中的方法跟 Java 的方法一样,只是多了点语法糖。
* 方法是组成类的一部分。方法有名字、类型签名,有时方法上还有注解,以及方法的功能实现代码(字节码)。
*
* 函数 :Scala 中的函数是一个完整的对象,是基于Function家族,0-22,一共23个Function Trait可以被使用,数字代表了Funtcion的入参个数
* 作用:1.函数可以直接赋值给变量,可以让函数很方便的传递;
* 2.闭包(closure),可以把灵活操作代码块,从而引申出其他灵活的语法
*
* apply 是 scala 中的语法糖:对一个对象 obj 上调用 obj(),scala 编译器会转换为 obj.apply();
* 在一个类 clazz 上调用 clazz(),scala 编译器会转换为 clazz_company_obj.apply(),其中 clazz_company_obj 为 clazz 的伴生对象。
*
* 方法和函数的区别:
* 1.方法不能作为单独的表达式而存在(参数为空的方法除外),而函数可以
* 2.函数必须要有参数列表,而方法可以没有参数列表
* 3.方法名是方法调用,而函数名只是代表函数对象本身+--
* 4.在需要函数的地方,如果传递一个方法,会自动进行ETA展开(把方法转换为函数)
* 5.传名参数本质上是个方法
*
*/
object Func {
//比如无参方法在申明时可以不加括号,甚至在调用过程也不用加括号
def f1 = 1 + 1
//比如方法可以添加泛型规则,这在java中只能在类申明
def f2[T](t: T) = {
t
}
//本地方法,即方法中嵌套方法
def method(): Unit = {
def print(str: String): Unit = {
println(str)
}
print("hello")
}
//一般采用下面方式定义函数
val fun = (v1: Int, v2: Int) => v1 + v2
def main(args: Array[String]): Unit = {
println(f1)
println(f2(1))
method
val s1 = fun(1,2)
println(s1)
}
}