函数的基本格式
fun 函数名(参数名:参数类型):返回值类型
说明:
- 函数的声明使用 fun 关键字
- 函数的调用与Java无异 对象.方法名(参数)
- 无返回值类型使用
Unit
表示,允许省略 - 函数修饰符默认是public,所以无public修饰
- 重写的方法是:overrite fun 函数名(参数名:参数类型):返回值类型
定义函数
以下是定义函数的几种样式:
-
定义无参数,无返回值的函数(表示无返回值的 Unit被省略了)
fun init(){ //函数体 }
-
定义无参数,无返回值的函数( Unit:类似Java中的void)
fun get() : Unit{ //函数体 }
-
定义无参数,返回值为String类型的public方法
fun get() : String{ //函数体 return "你好" }
-
定义 有参数,返回值为String类型的public方法
fun get(str:String) : String{ //函数体 return "你好" }
-
定义有参数,无返回值(参数1带问号,表示str参数可以是空值)
fun set(str : String ?,int : Int,arr :Array<String>){ //语句体 }
-
将表达式作为函数体、返回值类型自动推断的函数
fun sun(a:Int,b:Int) = a+b
基本格式-参数的几种形式
- 默认参数
默认参数:在定义函数时直接指定参数的默认值,
格式:参数名:参数类型 = 参数默认值
书写及调用如下
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//注意调用的时候没有给参数
Log.i(tag,get())//输出结果:你好--Kotlin
//提供参数值,则覆盖参数的默认值
Log.i(tag,get("hello world"))//输出结果:hello world--Kotlin
}
/**
* 有参数,返回值为String类型的public方法
*/
fun get(str:String = "你好") : String{
//函数体
return str+"--Kotlin"
}
通过以上代码可以看到当函数是有默认参数的,那么调用时可以不给参数;给参则覆盖参数的默认值
- 命名参数
命名参数:调用时更换默认参数的值
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/**
输出结果:除了int外都是默认的参数
Int类型参数值是:1
String类型参数值是:你好
Char类型参数值是:a
Boolean类型参数值是:true
*/
Log.i(tag,get1(1))
/**
输出结果:除了int外,Boolean 类型的参数发生了改变,调用方法时flag = false既是命名参数
Int类型参数值是:1
String类型参数值是:你好
Char类型参数值是:a
Boolean类型参数值是:false
*/
Log.i(tag,get1(1,flag = false))
}
/**
* 有参数,返回值为String类型的public方法
*/
fun get1(int :Int ,str:String = "你好",char :Char = 'a', flag :Boolean = true) : String{
//函数体
return "Int类型参数值是:$int\nString类型参数值是:$str\nChar类型参数值是:$char\nBoolean类型参数值是:$flag"
}
- 可变参数
某种类型的参数数量是不确定的,关键字vararg修饰
格式:vararg str :String 表示String类型的参数是不固定的
可变参数在使用时当做一个数组
函数的参数不能出现2个vararg以上
可变参数的类型可以是基本类型、数组、容器
可变参数是基本类型,以Int为例
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i(tag,get2(1,3,4))//输出结果:Int类型参数值是: 1, 3, 4,
}
/**
* 有参数,是可变参数
*/
fun get2(vararg int :Int ) : String{
var str = ""
for(it in int){
str = "$str $it,"
}
return "Int类型参数值是:$str"
}
可变参数是数组类型,以Array<Int>为例
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/**
输出结果:
第1个参数数组的元素是:{ 1, 2, 3,}
第2个参数数组的元素是:{ 11, 22, 33,}
第3个参数数组的元素是:{ 111, 222, 333,}
*/
Log.i(tag,get3(arrayOf(1,2,3), arrayOf(11,22,33), arrayOf(111,222,333)))
}
/**
* 可变参数为数组类型
*/
fun get3(vararg arrs :Array<Int> ) : String{
var count = 1
var t = ""
for(it in arrs){
//此时it表示的是一个数组参数
var str = ""
for(i in it){
//此时i表示的是一个数组参数中的一个元素
str = "$str $i,"
}
var s = "第${count}个参数数组的元素是:{${str}}\n"
count++;
t = t +s
}
return t
}
可变参数是容器之队列,以List<String>为例
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/**
输出结果:
第1个参数数组的元素是:{ 1q, 2q, 3q,}
第2个参数数组的元素是:{ 11q, 22q, 33q,}
第3个参数数组的元素是:{ 111q, 222q, 333q,}
*/
Log.i(tag,get4(listOf("1q","2q","3q"), listOf("11q","22q","33q"), listOf("111q","222q","333q")))
}
/**
* 可变参数是List<String>
*/
fun get4(vararg arrs :List<String> ) : String{
var count = 1
var t = ""
for(it in arrs){
//此时it表示的是一个队列参数
var str = ""
for(i in it){
//此时i表示的是一个数组参数中的一个元素
str = "$str $i,"
}
var s = "第${count}个参数数组的元素是:{${str}}\n"
count++;
t = t +s
}
return t
}
特殊函数
- 泛型函数
- 内联函数
- 简化函数
- 尾递归函数
- 高阶函数
泛型函数
定义泛型函数格式:fun <T>函数名(参数名:T){}
泛型函数可以定义在类的外面,是一个全局函数。
内联函数
定义内联函数格式:inline fun <reified T : Number>函数名(参数名:T){}
内联函数编译的时候回再调用处把该函数的内部代码直接赋值一份,调用几次就会复制几次(考虑内存泄漏)
Kotlin中要求参数类型完全匹配(子父类,实现类都不可以的)
/**
* 内联函数:有点参数传递的是父类,调用的时候给参数是子类
* 因为Kotlin要求参数类型完全匹配
*/
inline fun <reified T : Number> sum (array : Array<T>) : String{
var str = ""
for(it in array){
str = "$str $it,"
}
return str;
}
class MainActivity : AppCompatActivity() {
val tag = "MainActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i(tag,sum(arrayOf(1,2,3,4,5)))
Log.i(tag,sum(arrayOf(1.0,2.0,3.0,4.0,5.0)))
}
}
简化函数
格式: fun 函数名(参数名:参数类型):返回值类型 = 函数体
函数体比较简单的时候
fun sum(a : Int ,b : Int) :Int = if(a >= 0 && b >= 0) a+b else Math.abs(a)+Math.abs(b)
尾递归函数
尾递归函数:函数末尾的返回值重复调用了自己
格式:tailrec fun 函数名(参数名:参数类型):返回值类型{}
tailrace:告诉编译器是尾递归函数,编译器会相应的优化的
高阶函数
高阶函数:函数B的参数中包含另一个函数A,那么函数B就是高阶函数,函数A成为高阶函数的函数参数
增强系统函数
- 扩展函数
- 扩展高阶函数
- 日期时间函数
- 单例对象
扩展函数
扩展高阶函数
日期时间函数
单例对象
参考资料:《Kotlin从零到精通-Android开发》
Demo地址:https://github.com/sexyhair79/demokotlinBasics
网友评论