Loading...
墨滴

帅次

2021/12/07  阅读:35  主题:自定义主题1

【Kotlin 初学者】函数(方法)

函数

函数(function)和方法(method)这两个概念经常被混淆,他们到底有什么关联和区别?其实,它俩没有什么区别只是不同语言叫法不一样,在Java中普遍叫方法。而在Kotlin中普遍叫函数。重点是:函数(function)和方法(method)是同一个东西,别搞错了。

函数头

实践

fun main() {
    println(doUserInfo("ShuaiCi"18))
}

private fun doUserInfo(name:String,age:Int):String{
    return "$name 今年已经$age 了哦"
}

函数参数

  • 函数的参数默认值
    • 如果不打算传入值参,可以预先给参数指定默认值
  • 具名函数参数
    • 如果使用命名值参,就可以不用管值参的顺序(当参数过多的时候可以使用)

实践

fun main() {
    println(doUserInfo("ShuaiCi"18))
    //如果使用命名值参,就可以不用管值参的顺序
    println(doUserInfo(age = 6, name = "Kotlin"))

    //默认参数,可不传age
    println(doScUserInfo("Android"))
    //可传age
    println(doScUserInfo("Java",30))
}

private fun doUserInfo(name: String, age: Int): String {
    return "$name 今年已经$age 了哦"
}

//默认参数:预先给age指定默认值15
private fun doScUserInfo(name: String, age: Int = 15): String {
    return "$name 今年已经$age 了哦"
}

Unit函数

无参数返回>默认返回Unit,可不写

类似Java语言的void,只不过Unit是个单例类而不是关键字

实践

fun main() {
    println(doUnit("ShuaiCi"18))
    println(doUnit2("ShuaiCi"18))
}
//无参数返回>默认返回Unit,可不写
//类似Java语言的void,只不过Unit是个单例类而不是关键字
private fun doUnit(name: String, age: Int):Unit {
    println("$name 今年已经 $age 了哦")
}
//不写:Unit 也一样一样的
private fun doUnit2(name: String, age: Int) {
    println("$name 今年已经 $age 了哦")
}

Nothing类型

TODO函数的任务就是抛出异常,就是永远别指望它运行成功,返回Nothing类型。终止代码运行,不返回任何类型。你就就可以直接使用TODO()。

注意:不是注释提示,会终止程序的。

实践

fun main() {
    println("-----start-----")
    TODO("终止程序")
    println("-----end-----")
}

TODO函数

@kotlin.internal.InlineOnly
public inline fun TODO(reason: String)Nothing = throw NotImplementedError("An operation is not implemented: $reason")

反引号中的函数名

  • Kotlin可以使用空格和特殊字符对函数命名,不过函数名要用一对反引号括起来。(测试时可用)

  • 为了支持Kotlin和Java互操作,而Kotlin和Java各自却有着不同的保留关键字,不能作为函数名,使用反引号括住函数名就能避免任何冲突。

使用空格和特殊字符对函数命名

实践

fun main() {
    `20211202 世界对称日`("公众号:帅次")
}
private fun `20211202 世界对称日`(name :String ){
    println(name)
}

这个提示是:Android项目中不允许使用标识符。不影响运行。

Kotlin和Java互操作

Java代码

public class Test {
    public static final void fun(){
        System.out.println("来自Java的亲切问候");
    }
}

Kotlin

fun main() {
    //使用空格和特殊字符对函数命名
    `20211202 世界对称日`("公众号:帅次")
    //Kotlin和Java互操作
    Test.`fun`()
}

报错情况

拓展

匿名函数

定义时不取名字的函数,我们称之为匿名函数,匿名函数通常整体传递给其他函数,或者从其他函数返回。有了它,我们能够根据需要制定特殊规则,轻松定制标准库里的内置函数

{} 就代表匿名函数。

it关键字

只有一个参数的匿名函数时,可以使用it关键字来表示参数名。当你需要传入两个值参,it关键字就不能用了。这里简单的了解一下,在后面的实践中使用。

函数类型和隐式返回

函数的类型,由传入的参数和返回值类型决定

隐式返回:除了极少数情况外,匿名函数不需要return关键字来返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果

实践

fun main() {
    //1、声明函数的输入() 输出String
    val scFun :() -> String
    //2、实现函数
    scFun = {
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 就是个战五渣"
    }
    //此处别忘记加(),这里是函数而不是属性
    println(scFun())
}

然后你会发现在第一步下面有虚线,咱们操作一下。

代码如下,更加简洁了

fun main() {
    //1、声明函数的输入() 输出String
    //2、实现函数
    val scFun :() -> String = {
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 就是个战五渣"
    }
    println(scFun())
}

匿名函数参数

匿名函数可以不带参数,也可以带一个或多个任何类型的参数。

需要带参数时参数的类型放在匿名函数的类型定义中参数名放在函数定义中

实践

fun main() {
    //带参数
    val scFun2: (Int) -> String = { age ->
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 就是个战$age 渣"
    }
    println(scFun2(16))
}

这里是一个参数咱们尝试使用一下it关键字

it关键字实践

1 处,还有警告:这里的it代表传入的Int。

当这里的传入参数变成多个时,it就无法使用了。

类型推断

定义一个变量时,如果已把匿名函数作为变量赋值给它,就不需要显示指明变量类型。

无参

实践

    //无参类型推断
    val scFun4 = {
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 无参类型推断"
    }
    println(scFun4())

带参类型推断

实践

    //带参类型推断
    val scFun5 = { age:Int,money:Float->
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 带参类型推断 $age 岁啦,兜里$money"
    }
    println(scFun5(15,1.25f))

定义一个函数:参数是函数

一个函数,作为另一个函数的参数。

实践

fun main() {
    //2、声明函数
    val bookBeginner = {bookName:String,price:Double->
        "$bookName 定价为:$price"

    }
    //3、调用函数,传入函数bookBeginner
    learningAndroidBook("帅次",bookBeginner)
}
//1、定义一个函数(learningAndroidBook):参数是函数(bookPrice)
fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){
    println("$name 来自 learningAndroidBook ")
    println(bookPrice(name,48.88))
}

简略写法

一个函数的lambda参数排在最后,或者是唯一的参数,那么括住lambda值参的一对圆括号可以省略

fun main() {
    //4、简略写法(参数排在最后)
    learningAndroidBook("Kotlin 简略写法"){bookName:String,price:Double->
        "$bookName 定价为:$price"
    }
    //5、简略写法(唯一一个参数),()省略了
    learningAndroidBook2{bookName:String,price:Double->
        "$bookName 定价为:$price"
    }
}
//定义一个函数,参数是函数
fun learningAndroidBook2(bookPrice:(String,price:Double)->String){
    println(bookPrice("Kotlin 简略写法-唯一一个参数",48.88))
}

函数引用

要把函数作为参数传给其他函数使用,除了传lambda表达式(匿名函数),kotlin还提供了其他方法,传递函数引用,函数引用可以把一个具名函数转换成一个值参,使用lambda表达式的地方,都可以使用函数引用

实践

fun main() {
    //6.2、函数引用
    learningAndroidBook("函数引用",::bookPriceName);
}
//6.1 定义具名函数
fun bookPriceName(bookName:String,price:Double):String{
    //具名函数这里要加return
    return "$bookName 定价为:$price"
}
//1、定义一个函数(learningAndroidBook):参数是函数(bookPrice)
fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){
    println("$name 来自 learningAndroidBook ")
    println(bookPrice(name,48.88))
}

函数返回类型为匿名函数

fun main() {
    //使用
    val funName = helloSc()
    println(funName(15))
}
//定义具名函数,返回类型为匿名函数
fun helloSc():(Int)->String{
    val name = "渣渣次"
    //返回的匿名函数,age传入的参数
    return {age->
        //匿名函数返回类型
        "$age 岁的$name"
    }
}

帅次

2021/12/07  阅读:35  主题:自定义主题1

作者介绍

帅次

公众号:帅次