四、Kotlin——方法

8 阅读3分钟

一、基础

// 普通方法 ,没有返回值
fun  sum1(a: Int, b: Int)  {

}
// 普通方法,带有返回值
fun sum2(a: Int,b: Int): Int{
    return  a + b
}

1、默认参数

方法参数可以有默认值,当省略相应的参数时使用默认值。与其Java相比,这可以减少重载数量

fun  sum(a: Int = 10, b: Int) : Int{
    return  a + b
}

fun main() {
    val res = sum(b = 10)
    val res2 = sum(10,20)
    
}

2、如果参数有方法

fun  read(offset: Int = 0,start: Int,action:() -> Unit){
    // Unit是没有返回值的意思
    action()
}

fun main() {
    read(start = 10, action = {
        println("调用了")
    })
    //如果最后一个参数是方法,那么它既可以作为具名参数在括号内传,也可以在括号外传入。
    read(start = 5){
        println("调用了")
    }
}

3、可变数量的参数(Varargs)

方法的参数(通常是最后一个)可以用 vararg 修饰符标记:

fun append(vararg str: Char): String{
    val  result = StringBuilder()
    for (char in str){
        result.append(char)
    }
    return  result.toString()
}

fun main() {
    val  res = append('1','2','3','4')
    println(res)
}

当我们调用 vararg 方法时,我们可以一个接一个地传参,例如 append("h','e’,"",",o”),或者,如果我们已经有一个数组并希望将其内容传给该方法,我们使用伸展(spread)操作符(在数组前面加*):

fun append(vararg str: Char): String{
    val  result = StringBuilder()
    for (char in str){
        result.append(char)
    }
    return  result.toString()
}

fun main() {
    val world = charArrayOf('w', 'o','r','l','d')
    val  res = append('1','2','3','4',*world)
    println(res)
}

可变参数的要求: 。只有一个参数可以标注为 vararg;。如果 vararg 参数不是最后一个参数, 可以使用具名参数语法,给后面的参数的传递值

二、在类中使用的情况

1、普通类的方法

class  Persion{
    // 对象方法,
    fun  run(){
        println("跑起来")
    }
}

fun main() {
    
 val p = Persion()
    p.run()
}

2、静态类的方法

如果我们想实现一个工具util的话,可以借助 关键字object来创建一个静态类

//静态类里面的方法 都是静态方法
//不需要构建实例对象,可以通过类名,直接访问静态方法
object SumTool{
    // 都是方法
    fun sum(a: Int,b: Int): Int{
        return  a + b
    }
}


fun main() {
    val  res = SumTool.sum(6,8)
    println(res)
}

3、companion object 伴生类的方法

Kotlin中并没有static关键字,我们需要借助companion object 来实现类静态方法的目的

class  Persion{
    // 对象方法,
    fun  run(){
        println("跑起来")
    }
    //不需要构建实例对象,可以通过类名,直接访问静态方法
    companion object{
        fun  run(){
            println("静态方法,跑起来")
        }
        fun  test(){
            println("测试方法")
        }
    }
}

fun main() {
    // 对象方法的调用
    val p = Persion()
    p.run()
    
    //静态方法的调用
    Persion.run()
    Persion.test()
}

三、在类中使用的情况

在Java 8的时候开始支持Lambda表达式,目前Lambda语法在Java中已经被广泛的运用,Lambda表达式可以理解为是一种语法糖,值得庆幸的是,Kotlin一经开源成熟就已经支持这种语法。

lambda表达式作为方法中的参数的时候。定义transform方法,可以对数组中的元素进行变换

val  numbers = arrayOf(1,2,3,4)
transform(numbers, action = {
    index,element -> index * element
})
println(numbers)

transform(numbers){
    inex,element -> inex * element
}
println(numbers)

如何使用it

  • it并不是Kotlin中的一个关键字(保留字) 足
  • it是在当一个高阶方法中Lambda表达式的参数只有一个的时候可以使用it来使用此参数
  • it可表示为单个参数的隐式名称,是Kotlin语言约定的
var persions = arrayOf( Person(1), Person(2), Person(3))
 // 这里的it就表示每一个Person对象
 persions.forEach {
     //这里有个隐藏的it参数
     println(it.age)
 }

 //这里的it就表示每一个Int整数
 val numbers = arrayOf(1,3,5,7)
 numbers.forEach {
     //这里有个隐藏的it参数
     println(it)
 }

两个参数的

val numbers = arrayOf(1,3,5,7)
// 方式一
numbers.forEachIndexed(action = {index ,element ->
    println("index= $index element=$element")
})
// 方式二
numbers.forEachIndexed { index, element ->
    println("index= $index element=$element")
}