Kotlin 中函数参数为函数:以模拟数据库为例
本文概述:
- 函数A是函数B的参数:可以认为是共享参数的实现;本文以模拟实际成产环境中登录功能为例,对函数参数为函数进行了探究;同时,为了体现出Kotlin 语言的优越性,文末附相同功能的 Java代码实现;
- Kotlin中的Lamda表达式,在 Java中常采用接口进行处理
正文部分:
-
模拟数据库:用户名与密码字段
//模拟数据库 const val USER_MAME = "WAsbry" const val USER_PWD = "123" 复制代码
-
模仿前端作数据的校验
public fun loginAPI(username:String,userpwd:String,responseResulut:(String,Int) -> Unit){ //做简单校验 if(username == null || userpwd == null){//TODO 信息为空终止程序 } //调用服务端API if(webServiceLoginAPI(username,userpwd)){ responseResulut("Login success",200) }else{ responseResulut("Login error",444) } } 复制代码
-
细节一:前端的API为public修饰,开放给所有用户用于登录
- Kotlin 函数默认使用public修饰,写出来会爆灰
-
细节二:对于第三个参数,是前端返回给用户的数据;
- 在Kotlin中采用函数参数方式实现 在Java中需要替换为接口采用接口回调的方式
- 用户接收后,可以打印信息
-
-
模仿服务端:
private fun webServiceLoginAPI(name:String,pwd:String) : Boolean{ // return if(name == USER_MAME && pwd == USER_PWD)return true else return false return name == USER_MAME && pwd == USER_PWD } 复制代码
-
细节一:服务端API为私有,只开放给系统的前端API
-
细节二:在校验信息,比较字面量时
- Kotlin中的== 就相当于Java中的equals
-
细节三:在kotlin中if为表达式并非语句,其实可以有返回值的
- return if{}
-
-
main函数调用:
fun main(){ loginAPI("WAsbry","123"){msg:String,code:Int-> println("登录结果为:msg:$msg,code:$code") } } 复制代码
-
完整代码:
package step2 //函数A中的参数是函数B的函数:以模拟数据库为例 //模拟数据库 const val USER_MAME = "WAsbry" const val USER_PWD = "123" //模仿前端作数据的校验 public fun loginAPI(username:String,userpwd:String,responseResulut:(String,Int) -> Unit){ //做简单校验 if(username == null || userpwd == null){//TODO 信息为空终止程序 } //调用服务端API if(webServiceLoginAPI(username,userpwd)){ responseResulut("Login success",200) }else{ responseResulut("Login error",444) } } //模仿服务端 private fun webServiceLoginAPI(name:String,pwd:String) : Boolean{ return name == USER_MAME && pwd == USER_PWD } fun main(){ loginAPI("WAsbry","123"){msg:String,code:Int-> println("登录结果为:msg:$msg,code:$code") } } 复制代码
-
运行结果:
补充一:main函数的省略写法:一般都用写法三
fun main(){
//写法一:
loginAPI("WAsbry","123",{msg:String,code:Int->
println("登录结果为:msg:$msg,code:$code")
})
//写法二:
loginAPI("WAsbry","123",responseResulut = {msg:String,code:Int->
println("登录结果为:msg:$msg,code:$code")
})
// 写法三:
loginAPI("WAsbry","123"){msg:String,code:Int->
println("登录结果为:msg:$msg,code:$code")
}
}
复制代码
补充二:java 版本,使用接口进行处理了
package step2;
//定义接口用于回调
interface ResponseResult{
void result(String msg,int code);
}
public class Java29 {
//模拟数据库
public final static String USER_NAME = "WAsbry";
public final static String USER_PWD = "123";
public static void main(String[] args) {
Java29 ma = new Java29();
ma.login("WAsbry","123", new ResponseResult() {
@Override
public void result(String msg, int code) {
System.out.println("登录结果为:msg:"+msg+",code:"+code);
}
});
}
//模仿前端
public void login(String userName,String userPwd,ResponseResult responseResult){
//简单校验
if(userName == null || userPwd == null){
//TODO 用户名、密码存在空值
}
//调用服务端API
if(webServiceLogin(userName,userPwd)){
responseResult.result("Login success",200);
}else{
responseResult.result("Login error",444);
}
}
//模仿服务端
private boolean webServiceLogin(String name,String pwd){
//Java中的if为语句不是表达式,不具有返回值,不能直接return
if(name.equals(USER_NAME) && pwd.equals(USER_PWD)){
return true;
}else{
return false;
}
}
}
复制代码