三、Kotlin函数

79 阅读4分钟

1.函数的基本用法

(1)java和kotlin的区别

区别javakotlin
书写形式@Overridepublic void onCreate(Bundle savedInstanceState) {}override fun onCreate(savedInstanceState: Bundle?) {}
Override“@Override”表示该函数是重载了父类的方法小写的“override”在同一行表达重载操作
public表示该函数是公共方法默认函数就是公开的,所以省略了关键字“public”
void表示该函数没有返回参数不存在关键字“void”,若无返回参数则不用特别说明
funjava中没有fun表示函数的定义,类似java中的class
参数格式对象类型 对象名称对象名称: 对象类型
安全机制 Kotlin引入了空安全机制,如果某个对象允许为空的话,需要在对象类型后面加个问号“?”

 

  • 函数声明基本格式:

    fun 函数名 ():返回值类型{函数体}

    fun 函数名 (参数:参数类型){函数体}

    fun 函数名 (参数:参数类型):返回值类型{函数体}

  • 函数简化

    fun 函数名 (参数1:参数类型,参数2:参数类型):返回值类型{函数体}

    简化后:fun 函数名 (参数1:参数类型,参数2:参数类型):返回值类型=参数1+参数2(类型一致)

    举例:

    //原函数:

fun sum(a:Int , b:Int):Int{

return a+b

}

//简化后

fun sum(a:Int , b:Int):Int=a+b
  • 使用var声明函数

    kotlin中除了使用fun声明函数外也可以使用var

    举例1

var i={x:Int , y:Int -> x+y} //声明函数i,接收两个Int类型参数 x、y,返回 x+y 的值

i(3,5) //调用使用 var 声明的函数 i

举例2

var j:(Int,Int)->Int={x,y -> x+y} //声明函数j,它接收的参数是两个Int, 返回一个Int,对应的表达式是 {x,y->x+y}

j(4,4) //调用函数

注意:

如果没有返回值,使用 :Unit 标识,也可以省略不写

返回值也是使用 return 返回。

(2)输入参数的变化

  • 具有默认值的函数声明

    举例


val Pi=3.1415926

fun getRoundArea(PI:Float=Pi , radius:Float):Float{ //为变量PI赋予了默认值 Pi,这样,调用该方法时可以不再传递PI。但,如果我们想传入的值和默认值不一致时还是需要传入的

return PI*radius*radius

}
  • 调用带有默认参数值的函数
var a=getRoundArea(3.14f,5.0f) //因为我们相传入的PI和默认值不一致,所以,需要将3.14f传入
  • 具名参数的使用

    所谓具名参数,就是调用某个方法时指定传入参数给那个变量

var a=getRoundArea(radius=5.0f) //我们需要的PI值与默认值一致,此时不需要再传入PI值。只需要通过 radius=5.0f 声明我们传入了半径值

(3)参数长度可变的函数

关键字:vararg

定义:调用函数我们根据实际传入的参数个数由我们需求来定

举例:

fun varList(vararg vars: Int) { //关键在vararg

for (v in vars) { //遍历输入的内容

println(v)

}

}

2.特殊函数

(1)泛型函数

  • 特点:

    T代表泛型,定义泛型时需要在fun后面加T,然后要指明那个参数类型为T。

  • 泛型函数的定义:

fun <T> appendStr(tag: String,vararg otherInfo: T):String{

var str:String="$tag:"

//遍历可变参数中的泛型常量,将其转化为字符串再拼接到一起

for (item in otherInfo){

str="$str${item.toString()},"

}

return str

}

注意:Kotlin允许定义全局函数,即函数可放在单独的kt文件中定义,且其他地方也能直接调用
  • 泛型函数的使用:
R.id.btn_vararg_generic -> {

//泛型函数

tv_four_answer.text=when(count++%3){

0-> appendStr("泛型函数","string类型","举例一")

1-> appendStr("泛型函数int类型",1,2,3)

else -> appendStr("泛型函数double类型",1.2,1.3)

}

}

(2)内联函数

(3)简化函数

函数内容比较简单化,可以放在一行。

阶乘:

fun factorial(n:Int):Int =if (n<=1) n else n* factorial(n-1)

(4)尾递归函数

  • 特点:

    函数结尾调用函数自身,比如阶乘

  fun 前面添加 tailrec

尾递归函数会使用循环的方式替代递归,从而避免栈溢出。
  • 举例:
tailrec fun findFixPoint(x:Double=1.0):Double

=if (x==Math.cos(x)) x else findFixPoint(Math.cos(x))

(5)高阶函数

把A函数作为B函数的输入参数,此时,B函数就被称为高阶函数,A 函数则被称为函数类型的变量。

后续添加

(6)增强系统函数

1.扩展函数

  • 常用的扩展函数格式:
//要扩展哪个类中的方法,被扩展的类名就是哪个

fun 被扩展的类名.扩展函数名(..参数..){   

函数体

}

举例:

fun Array<Int>.swap(pos1: Int, pos2: Int) {   

函数体

}
  • 带泛型的扩展函数格式:
fun <T> Array<T>.swap(pos1: Int, pos2: Int) {   

函数体

}

2.扩展高阶函数

3.单例对象

使用object修饰类,替代class,类似java中的static class ,外部可以不需要构造对象就可以直接调用其中的属性和函数

3、构造函数constructor

kotlin里面的构造函数分为主构造函数和次构造函数。主构造函数只能有一个,次构造函数个数不限制,可以有一个或者多个。

(1).主要构造函数

//主构造方法如下,跟在类名后面
class Demo constructor(name:String){
  
}


class Democonstructor(){
    
}
//当主构造方法没有任何注解或者可见性修饰符时,可以省略,写成下面这样
class Demo{
    
}
//这种就是有注解标记的主构造方法,不能省略
class Demo @Inject internal constructor(){
    
}

(2).次要构造函数

//次构造方法,一个无参的次构造方法,一个有一个参数的次构造方法
class Person {
    constructor(){
        
    }
    constructor(name:String){
        
    }
}

(3).注意点

不管是什么构造方法,先执行init模块逻辑,后执行构造方法的逻辑