目录
一:函数构成
(1)带返回值
def关键字 + 函数名 + 参数 + (:返回值类型 ) + “=” + 函数体
返回值:默认解析
(可以没有返回值 —— Unit 表示空,如何理解)
例子:
def sayHello(name:String,age:Int)={if(age>18){printf("hi %s,you are a big boy,you age is %d\n",name,age);}else{printf("hi %s,you are a little boy,you age is %d\n",name,age);}}
var age2 = sayHello("Tom",23)
(2)过程:(不带返回值)
函数分类中: 没有返回值的函数被称为过程
方法:手动赋予 Unit 返回值类型
声明时,不使用 “=” 号
例子:
def sayHello(name: String) { print("Hello, " + name); "Hello, " + name }
def sayHello(name: String): Unit = "Hello, " + name
二:单行函数
含义:表明scala中函数的声明与代码块儿无关 “{ }” 的使用
def sayHello(name:String) = print("Hello,"+name);
三:函数调用
(1)递归调用函数时:需明确声明
def fab(n: Int): Int = {
if(n <= 1) 1
else fab(n - 1) + fab(n - 2)
}
计算过程:
换算成平行的并列算子即可
(2)默认参数
效果:
调用参数时,不用传递非必要参数,不用与声明的参数个数一致
从左向右依次插入
例子:
def sayHello(firstName:String,middleName:String="William",lastName:String="Tom")=firstName+" "+middleName+" "+lastName;
sayHello("Hello")
好处: 与java对比,代码更简洁
更灵活
(3)带名参数
构成: 变量名称 + “=” + 值
例子:
sayHello(firstName = "Mick", lastName = "Nina", middleName = "Jack")
(4)变长参数
1》思考:变长函数和直接传递数组的区别
方法体构造:将 nums 当成Array 集合去遍历
传递参数时:不受参数长度的影响,任意添加数值
省去了构建数组的过程
例子:
def sum(nums:Int*)={
var res = 0;
for(num <- nums) res += num
res;
}
2》使用序列调用变长参数:
序列 + 特殊语义 ————》 构成调用该方法的参数
例子: val s = sum(1 to 5: _*)
3》序列:的含义
* List序列
* 分为变长和不可变长序列,底层是链表
* 特点:有序,可重复,增删快,查询慢
* 不可变长序列:长度和角标都不可变
val list1 = List(1, 2, 3, 4)
不能使用 val s = sum(list1) 不可行
val s = sum(list1:_*) 可行
对特殊语义的理解::_*
作用:现阶段作用: 将序列参数化
4》使用递归函数实现累加:
def sum2(nums: Int*): Int = {
if (nums.length == 0) 0
else nums.head + sum2(nums.tail: _*)
}
tail:英 [te?l] 尾巴
head:头部 序列的第一个元素
(5)运算符与函数的相互转化
1》运算符的改变: 本身当成函数去使用
运算符:+、-、*、/ 等等
例子:1.+(1)
res1: Int = 2
2》函数本身亦可以当成符号去使用
例子: 1.to(10) ————》 1 to 10
(6)不传参的函数调用
可以省略 括号
例子:"Hello World".distinct
——》 "Hel Wrd"
(7)apply函数(Object类型自带)
调用时的缩写:
"Hello World"(6),实际上是"Hello World".apply(6)
例子:Array(1,2,3,4)