Kotlin函数之一
一、函数的基本写法及用法:
class
FunTest {
//函数写法
/*
*fun:声明函数的关键字
* String:返回值类型
* a:传入参数.如果参数有多个以"参数名:类型名"的形式写入。参数之间用“,”隔
*每个参数必须加上参数类型
*double:函数名
*return "$a":返回值
*/
fun
double(a:Int):String{
return
"
$
a
"
;
}
}
//函数用法:对象.函数名
fun
main(args: Array) {
val
funTest=FunTest();
val
res=funTest.double(
4
);
println
(res);
}
二、参数:
1、默认值:当传入函数的参数被忽略时,可以使用参数默认的值(相对应的,假如你没有给定默认值,那么你就必须传入该参数)。
fun
varebleFun(a:Int=
10
,str:String=
"默认值"
,funTest:FunTest= FunTest()){
println
(
"a==
$
a
\n
str==
$
str
\n
funTest==
$
funTest
"
);
}
fun
main(args: Array) {
val
funTest=FunTest();
funTest.varebleFun();//此处调用并忽略了参数
}
//运行结果
a==10
str==默认值
funTest==
test.FunTest@5e2de80c
2、命名参数:
fun
reformat(str: String, normalizeCase: Boolean =
true
,upperCaseFirstLetter: Boolean =
true
,
divideByCamelHumps: Boolean =
false
,
wordSeparator: Char =
' '
) {
}
//我们可以不用定义变量直接使用参数的变量名来给其赋值
reformat(str, wordSeparator
=
'_'
)
三、返回值:
1、
Unit
:默认方法返回值,类似于Java中的void,可以理解成返回没什么用的值。
//?:表示该值可能为空(如下:如果没有?,那么在使用该函数就不能传入null)
fun
printHello(name: String?): Unit {
if
(name !=
null
)
println
(
"Hello
${
name
}
"
)
else
println
(
"Hi there!"
)
// return;//可以直接return
return
Unit;
}
如果不需要返回值也可以像在Java写没有返回值的方法一样,如下:
fun
noReturn(){
}
四、单表达式函数:
当函数只返回单个表达式时,大括号可以省略并在 = 后面定义函数体
fun
singleExpression(x: Int): Int = x*
2
在编译器可以推断出返回值类型的时候,返回值的类型可以省略:
fun
singleExpression(x: Int) = x *
2
五、可变参数:
函数的参数(通常是最后一个参数)可以用 vararg 修饰符进行标记:
这里的变长其实是两个意思:参数类型可变化、参数个数可变化。
写法如下:
fun
asList1(number:Int,
vararg
ts: String): List {
val
result = ArrayList()
for
(t
in
ts)
result.add(t)
return
result
}
调用:funTest.asList1(
1
,
"string_1"
,
"string_2"
);
//此写法可以传入不同类型的参数
fun
asList(
vararg
ts: T): List {
val
result = ArrayList()
for
(t
in
ts)
result.add(t)
return
result
}
调用:funTest.asList(
1
,
2
,
""
,FunTest());
六、函数范围:
*权限修饰符
// file name: example.kt
package
foo
private fun
foo() {}
// 只在 example.kt 文件内可访问
public fun
foo() {}
// 在任何地方都可以访问
internal fun
foo() {}
// 在同一个模块(module)内可以访问
1、顶级函数:所谓顶级函数就是隶属于包的函数,不属于任何一个类。
作用域:任何地方+权限修饰符限定区域。
2、局部函数:如:写在函数内的函数称为局部函数。
作用域:局部。
3、成员函数:
作用域:对象作用域+权限修饰符限定区域。
七、扩展函数:
在一个类的基础上扩展一个额外的函数(即向某类中再额外增加一个函数,来供该类调用,但是实际上又不对该类进行修改)。
/*
*FunTest:要扩展的类的类名。
* extensionFun:扩展函数的函数名。
*/
fun
FunTest.extensionFun(b:Int):Int{
return
b+
1
;
}
fun
main(args: Array) {
//扩展函数的使用:
val
funTest=FunTest();
funTest.
extensionFun
(
5
);
}
特点:
1、扩展函数写在类之外,包之内:此时直属于包,使用时需要导入“包名.函数名”,可以在包外以及其他类中使用。
2、扩展函数写在类之内:此时直属于该类,只能在该类中使用。
3、扩展函数是被静态解析。
4、当一个类存在一个普通函数和扩展函数相同时,调用普通函数。
八、中缀(infix):
//当函数是成员函数或者是扩展函数只有一个参数时使用infix关键词进行标记
//扩展函数以infix修饰:
infix fun
Int.extendFun(b:Int): Int {
return this
+b;
}
class
FunTest {
//成员函数以infix修饰:
infix fun
infixFun(b:Int):Int{
return
b*
7
;
}
}
fun
main(args: Array) {
val
funTest=FunTest();
//扩展函数的使用:
funTest.
extensionFun
(
5
);
//用中缀注解调用扩展函数
funTest extendFun
5
;
//用中缀注解调用扩展函数
val
a=
1
extendFun
4
;
val
b=
1
.
extendFun
(
4
);
}