方法与函数区别:
1. 从定义格式来看:
(1)方法定义需要def关键字
(2)函数是一个对象,继承自FunctionN,需要一个形参接收(匿名除外)
2. 从JVM角度
(1)方法是类中定义的,加载到方法区
(2)函数是对象,加载到堆中
1.方法 method 定义
/*方法定义*/
//result_type可以省略,由scala自推断出
def method_name(param_name:param_type) [:result_type] ={
method_body
}
//如果没参数,可以简化省去 (param_name:param_type)
/*方法调用*/
//无括号调用 用于无参数的方法
method_name
//花括号
obj.method_name{
expr_1
expr_2
...
} //最后一个表达式值作为方法参数,仅用于只有一个参数的方法
//中缀
obj method_name param //多个参数要括起来
//后缀
obj.method_name(param) //和java对象方法一样
2. 函数 function 定义
val func_name [ : param_type => result_type ] = (param_name:param_type …) => function_body
val myFunc:Int=>String = (c:Int)=>"*"*c
// val myFunc:Int=>String = (c)=>"*"*c 也可以,因为参数类型已指定
//简化模式
val myFunc2 = (c:Int)=>"*"*c //返回值参数scala可以自己判断
/*匿名函数*/
// 常用于集合中,集合元素作为参数传入
println( (1 to 10 ).map(x=>"*"*x) //配合map,会将集合的元素作为参数x传入函数中,此时参数类型也不用指定了,会由scala根据集合元素类型判断
// 使用 _ 简化
println( (1 to 10 ).map("*"*_)
3.方法转、函数转换
3.1 柯里化 Currying
spark源码大量使用柯里化,了解
将函数作为方法参数的一部分,提供更好的扩展性
def method_name(_param:_type)(func:param_type=>result_type)={
func(_param)
}
def m( num:Int)(myFunc:Int=>Unit){
println("执行一个柯里化方法")
myFunc(num)
}
m(2)(println("&"*_)//参数只能用_调用,而函数在一个参数下可以_
3.2 方法转函数
//方法名后加 _ 即可将方法作为变量赋值
val a = method_name _