kotlin匿名函数
fun main() {
//TODO ==================Kotlin语言的匿名函数
var len ="Derry".count()
println(len);
var len2="Derry".count(){
//it 等价于D e r r y 的字符 lamda表达式
it=='r'
}
println(len2);
}
kotlin的函数类型&隐式返回
fun main() {
//TODO ==================Kotlin语言的函数类型&隐式返回
//TODO ==================我们现在写函数
//第一步: 函数输入输入的申明
var methodAction :() ->String
//第二步:对上面函数的实现 lamda表达式
methodAction = {
var inputValue =999999
"Derry"
//匿名函数不要写return,最后一行就是返回值
"$inputValue Derry"
}
//第三步:调用函数
println(methodAction())
}
Kotlin语言的函数参数
fun main() {
//TODO ==================Kotlin语言的函数参数
//开始写函数
//第一步:函数输入与输入申明 第二步:对申明函数的实现
var methodAction: (Int,Int,Int)->String={n1,n2,n3->
var inputValue =999999
"Derry"
//匿名函数不要写return,最后一行就是返回值
"$inputValue Derry 参数一:$n1,参数二:$n2,参数三:$n3"
}
println(methodAction(1,2,3)) //999999 Derry 参数一:1,参数二:2,参数三:3
}
kotlin语言的it关键字
fun main() {
//TODO ==================Kotlin语言的it关键字
//相当于item 单个参数没有取名默认名为it
var methodAction: (Int,Int,Int)->String={n1,n2,n3->
var inputValue =999999
"Derry"
//匿名函数不要写return,最后一行就是返回值
"$inputValue Derry 参数一:$n1,参数二:$n2,参数三:$n3"
}
var methodAction2: (String) ->String = {"${it}"}
}
Kotlin语言匿名函数的类型推断
fun main() {
//TODO ==================Kotlin语言匿名函数的类型推断
//如果方法名是:的方式必须指定 参数类型 和返回类型
//方法名=类型推断返回值
var method1= { v1:Int,v2:Double,v3:String ->
"v1=$v1,v2=$v2,v3=$v3"
}
var method2= { 1.4f}
var method3= { 999}
println(method1(1,2.0, "3"))
}
Kotlin语言的lamda学习
fun main() {
//TODO ==================Kotlin语言的lamda学习
val addResult = {v1:Int,v2:Int->"v1加v2的结果是:${v1 + v2}"}
println(addResult(2,7))
//匿名函数 入参 Int 返回类型Any
//lamda表达式的入参 Int lambda表达式的结果Any类型
var workResult= { v1 :Int->
when (v1) {
1->"星期一"
2->"星期二"
3->"星期三"
4->"星期四"
5->"星期五"
else->-1
}
}
println(workResult(5))
}
Kotlin语言的函数中定义参数是函数
fun main() {
//TODO ==================Kotlin语言的函数中定义参数是函数
loginApi("ad", "123456"){msg:String,code:Int->
println("登陆结果: $msg,code:$code")
}
}
//模拟数据库
const val UserName = "admin"
const val Password = "password"
//登陆
fun loginApi(username: String, password: String,responseResult:(String ,Int)->Unit) {
if (username.isBlank() || password.isBlank()) {
TODO("用户名或密码为空")
}
if(username.length>3&&password.length>3) {
if (username.equals(UserName) && password.equals(Password)) {
responseResult("LOGIN SUCCESS",200)
}else{
responseResult("LOGIN ERROR",404)
}
}else{
TODO("用户名或密码不符合规范")
}
}
fun checkDataTimeOverlap(dataStartTime: LocalDateTime, dataEndTime: LocalDateTime,
dbStartTime: LocalDateTime, dbEndTime: LocalDateTime) {
if (dataEndTime.isBefore(dataStartTime) || dbEndTime.isBefore(dbStartTime)) {
throw IllegalArgumentException("End time must be after start time")
}
if (!dataStartTime.isBefore(dbEndTime) || !dataEndTime.isAfter(dbStartTime)) {
throw IllegalArgumentException("Data time overlaps with DB time")
}
}
Kotlin语言的函数内联学习
fun main() {
//TODO ==================Kotlin语言的函数内联学习
loginApi("ad", "123456"){msg:String,code:Int->
println("登陆结果: $msg,code:$code")
}
}
//模拟数据库
const val UserName = "admin"
const val Password = "password"
//登陆
//如果不申明为内联函数会有性能损耗
//如果此函数使用内联相当C++中的#define 宏定义 宏替换 会把代码替换到调用处 调用出没有任何 函数开辟 对象开辟的损耗
//小结:如果函数中有使用到lamda表达式.尽量使用 inline关键字,这样内部会做优化,减少,函数开辟,对象开辟 的损耗
inline fun loginApi(username: String, password: String,responseResult:(String ,Int)->Unit) {
if (username.isBlank() || password.isBlank()) {
TODO("用户名或密码为空")
}
if(username.length>3&&password.length>3) {
if (username.equals(UserName) && password.equals(Password)) {
responseResult("LOGIN SUCCESS",200)
}else{
responseResult("LOGIN ERROR",404)
}
}else{
TODO("用户名或密码不符合规范")
}
}
Kotlin语言的函数引用
fun main() {
//TODO ==================Kotlin语言的函数引用
login("admin", "123456",::methodResponseResult)
//函数引用
//lambda属于函数类型的对象,需要把methodResponseResult普通函数变成 函数类型的对象(函数引用)
//login("admin", "123456",::methodResponseResult)
}
fun methodResponseResult(msg:String,code:Int) {
println("登录结果为${msg},code${code}")
}
const val username1="username"
const val password1="password"
inline fun login(username: String, password: String,responseResult :(String ,Int)->Unit){
if(username == username1 && password == password1){
responseResult("登录成功",200)
}else{
responseResult("登陆失败",404)
}
}
Kotlin语言的函数类型作为返回类型
fun main() {
//TODO ==================Kotlin语言的函数类型作为返回类型
// show("学习kotlin")
//val show2Method = show2("show")
//show2Method==匿名函数 是show2的返回值,只不过这个函数是一个函数
//println(show2Method("Derry",35))
println(show2("show")("Derry",35))
}
fun show(info:String):Boolean{
println("我是show函数 info:${info}")
return true
}
fun show1(info:String):String{
println("我是show函数 info:${info}")
return "嘿嘿嘿"
}
fun show2(info:String):(String,Int)->String{
println("我是show函数 info:${info}")
// return 一个函数 匿名函数
return { name:String,age:Int ->
"我是匿名函数:我的name:$name,age:$age"
}
}
Kotlin语言的匿名函数与具名函数
fun main() {
//TODO ==================Kotlin语言的匿名函数与具名函数
//匿名函数
showPersonInfo("李四",57,"翻斗花园","13141@163.com","13554543"){
println("显示结果:$it")
}
//具名函数
showPersonInfo("牛爷爷",99,"翻斗花园","13@163.com","13554543",::showPersonInfoImpl)
}
fun showPersonInfoImpl(result:String){
println("显示结果:$result")
}
inline fun showPersonInfo(name:String, age:Int, address:String, email:String, phone:String,showResult:(String)->Unit){
var result ="name:$name,age:$age,address:$address,email:$email,phone:$phone"
showResult(result)
}
Kotlin语言可空性特点
fun main() {
//TODO ==================Kotlin语言可空性特点
//TODO ==================默认是不可能空类型,不能随意给null
var name="张三"
//不能为空类型的
//name = null
//TODO ==================第二种情况:申明时指定为可空类型
var name2 :String ?
name2 = null
name2 = "张根硕"
}
Kotlin语言安全调用操作符
fun main() {
//TODO ==================Kotlin语言安全调用操作符
var name: String? = "张三"
name=null
// name.capitalize() //name是可空类型的,可能是null,想要使用name,必须给出补救措施
name?.capitalize() //name是可空类型的,如果name真的是null?后面一段代码不执行,就不会引发空指针异常
}