Kotlin 初学者函数(方法)
Posted 帅次
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 初学者函数(方法)相关的知识,希望对你有一定的参考价值。
作者简介:CSDN博客专家、华为云享专家认证
系列专栏: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、简略写法(唯一一个参数),()省略了
learningAndroidBook2bookName: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"
以上是关于Kotlin 初学者函数(方法)的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin - 如何将空值传递给片段 newInstance 方法?
Android 上的 Kotlin:如何在片段中使用数据库中的 LiveData?