函数是一个右特定功能的代码。
具备三要素:函数名,参数列表,函数体。
def 函数名(参数名:参数类型,....) :返回值类型 = {
// 函数体
}
// main
def main(args:Array[String]):Unit = {
}
// 自定义函数 sum(1,2) = 3s
def sum(x:Int,y:Int):Int = {
x+y
}
注意:
- 函数体中的最后一行代码会作为函数的返回值,无需return。
- 在声明函数时,如果函数没有返回值,函数可以简化为如下的写法:
def sum(x : Int,y : Int){ println(x+y)}
,完整写法def sum(x:Int,y:Int):Unit = { println(x+y)}
- 在声明函数时,如果函数有返回值,函数可以简化为如下的写法:
def sum(x : Int,y : Int)={ x+y}
,完整写法:def sum(x : Int,y: Int): Int = {x + y}
调用函数
语法:函数名‘(实参列表)’
var total = sum(1,2)
def sum(x:Int,y:Int) = { // 自动推导出来返回值类型是? Any
if(x == 1){
x+y
}else{
//x+y+"!"
x+y+0.0
}
}
// java版本
public static Object m1(int x,int y){
if(x == 1){
return x+y;
}else{
return x+y+"!";
}
}
可变长参数
语法:形参名:类型*
def fun(abc:String*)"String={
}
def sum(args:Int*):Int={
var total = 0
for(n < - args){
total += n
}
total
}
参数默认值
在Scala中,函数的参数允许指定一个默认值,在调用函数时,如果没有对形参赋予实参值,则使用传递的值。
语法
def 函数名(形参名:形参类型 = 初始值,形参名2:形参类型2 = 初始值2)...
def sum(x:Int,y:Int,initValue:Int = 10)={
x+y+initValue
}
//调用函数
sum(1,2)
sum(1,2,3)
def sum (initValue:Int = 10,x:Int,y:Int)={
x+y+initValue
}
// 语法:带名参数
// 调用函数时 手动指定实参赋予形参信息
// 需要按照形参声明顺序赋值吗? 不需要
sum(x=1,y=2,initValue = 3)
递归函数
递归:一个函数在函数体内又调用了本身
// 递归思想 求 1~5整数之和
def sum(n:Int):Int={
var total = 0
if(n >= 1){
total = n + sum(n-1)
/*
第一次: total = 5 + sum(4)
第二次: total = 5 + total + sum(3)
第三次: total = 5 + total + total +sum(2)
5 4 3 2 1 ---> 1 2 3 4 5
*/
}
total
}
// 递归 求 1~10阶乘 1*2*3*4*N 1*2*3*4*5 = 120
def factorial(n:Int):Int={
var total = 1
if(n > 1){
total = n * factorial(n-1)
/*
第一次: total = 5 + sum(4)
第二次: total = 5 + total + sum(3)
第三次: total = 5 + total + total +sum(2)
5 4 3 2 1 ---> 1 2 3 4 5
*/
}
total
}
匿名函数
没有函数名的函数。
语法:(形参列表) => 函数体
//声明求和的匿名函数
(x:Int,y:Int) => x+y
() => 10
(x:Int,y:Int,z:String,a:Double) => println(x + "\t"+y+"\t"+z+"\t"+a)
注意:
- 在scala中匿名函数对应的函数对象
Function
- 在scala在内置了23个函数对象,分别是
Function0~Funtion22
(表示的是接受0-22个参数的匿名函数对象) - 匿名函数不能使用参数默认值。
object Function{
def main(args: Array[String]): Unit = {
//n匿名函数 -》 函数对象
//将函数对象的引用赋予 f1
val f1 = (x:Int ,y:Int) => x+y
//调用匿名函数
val sum = f1(1,2)
println(xum)
//手动创建函数对象 Function02 接受三个参数的函数对象 前三个类型表示形参类型,最后一个类型为返回值类型
val f2 = new Function02[Int,Int,Int,String]{
override def apply(v1: Int, v2: Int, v3: Int): String = {
v1 + v2 + v3 + "!"
}
}
val str = f2(1,2,3)
println(str)
}
}
柯里化函数(Currying)
柯里化函数指的是将接受多个参数的函数变为接受单个参数的函数并且返回一个函数对象的过程。
有点:代码的通用性更强
原始函数:sum(x;int,y:Int)
柯里化:sum(x:Int) = (y:Int) => x+y
object Function03{
def main(args: Array[String]): Unit = {
// 如:接受多个参数的匿名函数
val f2 = (x: Int, y: Int) => x + y
val f3 = (x:Int) => (y:Int) => x+y
}
def sum1(x: Int)(y: Int)(z: Int) = {
x + y + z
}
def sum2(x: Int) = {
(y: Int) => (z: Int) => x + y + z
}
}