目录
1.Kotlin语言中的简略语法学习
// TODO 29 Kotlin语言中的简略语法学习
fun main() {
//第一种方式
loginAPI2("bxxb","123456"){ msg : String,code : Int ->
println("登录结果如下:msg:$msg,code:$code")
}
//第二种方式
loginAPI2("bxxb","123456"){ msg : String ,code : Int ->
println("登录结果如下:msg:$msg,code:$code")
}
//第三种方式
loginAPI2("bxxb","123456", responseResult = { msg : String ,code : Int ->
println("登录结果如下:msg:$msg,code:$code")
})
}
//模拟数据库SQLServer
const val USER_NAME_SAVE_DB2 = "bxxb"
const val USER_PWD_SAVE_DB2 = "123456"
//登录API 模仿前端
public fun loginAPI2(username : String, userpwd : String,responseResult : (String , Int) -> Unit){
if(username == null || userpwd == null){
TODO("用户名或密码为空") //出现问题程序终止
}
//前端校验
if (username.length > 3 && userpwd.length > 3){
if(webServiceLoginAPI2(username,userpwd)){
//登录成功
responseResult("login success",200)
}else{
//登录失败
responseResult("login error",444)
}
}else{
TODO("用户名和密码违规")
}
}
//登录API 服务器
private fun webServiceLoginAPI2(name : String,pwd : String) : Boolean{
return name == USER_NAME_SAVE_DB && pwd == USER_PWD_SAVE_DB
}
输出结果为:
2.Kotlin语言的函数内联学习
// TODO 30 Kotlin语言的函数内联学习
fun main() {
//第三种方式
loginAPI3("bxxb","123456", responseResult = { msg : String ,code : Int ->
println("登录结果如下:msg:$msg,code:$code")
})
}
//模拟数据库SQLServer
const val USER_NAME_SAVE_DB3 = "bxxb"
const val USER_PWD_SAVE_DB3 = "123456"
//登录API 模仿前端
//此函数有使用lambda作为参数,就需要声明成内联
//如果此函数,不使用内联,在调用端,会生成多个对象来完成lambda的调用(会造成性能损耗)
//如果此函数,使用内联,相当于 C++ #define 宏定义 宏替换 会把代码替换到调用处,调用处没有任何函数开辟,对象开辟的损耗
//小结:如果函数参数有lambda,尽量使用 inline 关键字,这样内部会做优化,减少 函数开辟 对象开辟的损耗
public inline fun loginAPI3(username : String, userpwd : String,responseResult : (String , Int) -> Unit){
if(username == null || userpwd == null){
TODO("用户名或密码为空") //出现问题程序终止
}
//前端校验
if (username.length > 3 && userpwd.length > 3){
if(webServiceLoginAPI3(username,userpwd)){
//登录成功
responseResult("login success",200)
}else{
//登录失败
responseResult("login error",444)
}
}else{
TODO("用户名和密码违规")
}
}
//此函数没有使用lambda作为参数,就不需要声明成内联
//登录API 服务器
fun webServiceLoginAPI3(name : String,pwd : String) : Boolean{
return name == USER_NAME_SAVE_DB && pwd == USER_PWD_SAVE_DB
}
3.Kotlin语言的函数引用学习
// TODO 31 Kotlin语言的函数引用学习
fun main() {
//函数引用
//lambda属于函数类型的对象,需要把methodResponseResult普通函数变成 函数类型的对象(函数引用/也就是加上帽帽::)
login("bxxb","123456",::methodResponseResult)
}
fun methodResponseResult(msg : String , code : Int){
println("最终的登录结果是msg:$msg,code:$code")
}
//模拟数据库SQLServer
const val USER_NAME_SAVE_DB4 = "bxxb"
const val USER_PWD_SAVE_DB4 = "123456"
inline fun login(name : String , pwd : String ,responseResult: (String , Int) -> Unit){
if(USER_NAME_SAVE_DB4 == name && USER_PWD_SAVE_DB4 == pwd){
//登录成功
responseResult("登录成功",200)
}else{
responseResult("登陆失败",444)
}
}
4.Kotlin语言的函数类型作为返回类型
// TODO 32 Kotlin语言的函数类型作为返回类型
fun main() {
val showMethod = showMethod("bb")
println(showMethod("bxb", 22))
}
fun show(info : String) : String{
println("我是show函数:info:$info")
return "aa"
}
fun showMethod(info : String) : (String , Int) -> String{
println("我是show函数 info:$info")
// return 是匿名函数
return { name : String , age : Int ->
"我是匿名函数:name:$name,age:$age"
}
}
5.Kotlin语言的匿名函数与具名函数
// TODO 33 Kotlin语言的匿名函数与具名函数
fun main() {
//匿名函数
showPersonInfo("bxb",22,'男'){
println("显示结果为:$it")
}
//具名函数 showResultImpl
showPersonInfo("bxb",23,'男',::showResultImpl)
}
fun showResultImpl(result: String){
println("显示结果为:$result")
}
inline fun showPersonInfo(name: String, age: Int, sex: Char, showResult: (String) -> Unit){
val str = "name:$name,age:$age,sex:$sex"
showResult(str)
}
6.Kotlin语言的可空性特点
// TODO 34 Kotlin语言的可空性特点
fun main() {
//TODO 第一种情况:默认是不可空,不能随意给null
var name : String = "bxb"
// 提示:Null can not be a value of a non-null type String
//不可为空
//name = null
println(name)
//TODO 第二种情况:声明时指定为可空类型
var name2 : String ?
name2 = null
println(name2)
}
7.Kotlin语言的安全调用操作符
// TODO 35 Kotlin语言的安全调用操作符
fun main() {
var name : String ? = "bxb"
name = null
//name.capitalize() //name是可空类型的 可能是null,想要使用name,必须给出补救措施
val r = name?.capitalize() //name是可空类型的 如果真的是null, ?后面这一段代码不执行,就不会引发空指针异常
println(r)
}
8.Kotlin语言中使用带let的安全调用
// TODO 35 Kotlin语言中使用带let的安全调用
fun main() {
var name : String ? = null
name = "bxb"
name = ""
//name是可空类型的,如果真的是null,?后面的代码不执行,就不会引发空指针异常
val r = name?.let {
//it = name 本身
//如果能够执行到这里,it 一定不为null
if(it.isBlank()){ //如果name值是空值 "" 没有内容
"Default"
}else{
"[$it]"
}
}
println(r)
}
9.Kotlin语言中的非空断言操作符特点
// TODO 35 Kotlin语言中的非空断言操作符特点
fun main() {
var name : String ? = null
name = "bxb"
val r = name!!.capitalize()//!!断言 不管name是否为null都执行
println(r)
//结论:规矩:如果百分百能保证name是有值的,那么才能使用断言 !!,否则有java空指针异常的风险
}
10.Kotlin语言中使用if判断null值的情况
// TODO 37 Kotlin语言中使用if判断null值的情况
fun main() {
var name : String ? = null
//name.capitalize() //name是可空类型的 可能是null,想要使用name,必须给出补救措施
//name = "bxb"
if(name != null){
val r = name.capitalize()
println(r)
}else{
println("name is null")
}
}
11.Kotlin语言空合并操作符
// TODO 38 Kotlin语言空合并操作符
fun main() {
var name : String ? = "bxb"
name = null
//空合并操作符 xxx ?: "原来你是null啊" "如果xxx等于null,执行?: 后面的区域,否则执行name"
println(name ?: "原来你是null啊")
//let 函数 + 空合并操作符
println(name?.let { "[$it]" } ?: "原来你是null啊2")
}