看书总是觉得都懂了,实际操作二百五,试着默写出来才是真的懂,就是写写有点累。
Kotlin简单语法
变量
1. 关键字var和val
1.var 和val的区别 var:可以改变的变量 val :第一次赋值后,无法进行更改的变量 注意:当变量赋值的时候,首先选择val进行,如果val不满足要求的情况下才选择var,这样能够使得代码更加健壮。
var a=10
a=20
val b=20
b=20
2.不必显式声明变量类型
kotlin 具备强大的推导能力,所以变量的定义的时候无需显示声明。 但是延迟赋值的时候,就需要显示声明了,声明的方法是 变量名后面:加类型 延迟赋值:通常使用了lateinit ,在对象的属性声明的时候不初始化,在用到的时候再初始化。
val a=10
val b:Int =10;
3. 变量的类型
如上面例子所示,和java相比,Int 是大写的,这代表Kotlin放弃了基础数据类型,全部选择的是对象数据类型。Int,Long,Short,Float,Double,Boolean,Byte,Char
函数
函数的定义
函数的定义fun关键字+函数名+(参数:变量类型)+:返回值类型+函数体。无返回值时不需要声明返回值类型。
fun saySomething(msg:String){
print(msg)
}
fun saySomething(msg:String,name:String){
print(name+"说"+msg)
}
fun saySomething(msg:String):Int{
print(msg)
return 1
}
语法糖
当函数只有一条语句的时候,直接写在函数的后面用等号连接
fun saySomething(msg:String)= print(msg)
流程控制
if
if 语句和大多数的语言里面的if语句相类似,唯一新增了一个就是可以有返回值,返回值是每个条件里面的最后一行。
//传统写法
fun largerNumber(num1:Int,num2:Int):Int{
var max=0;
if (num1>num2){
max= num1
} else{
max=num2
}
return max
}
//新特性的改写
fun largerNumber(num1:Int,num2:Int):Int{
if (num1>num2){
num1
} else{
num2
}
}
//语法糖 因为只有一句语句( if和else是整体,结果就是返回一个值) ,套用上面的语法糖所以可以用等号连接
fun largerNumber(num1:Int,num2:Int):Int= if (num1>num2) num1 else num2
//当然既然采用了语法糖用等于号连接,那么也可以省略显式声明,让kotlin自己推导类型
fun largerNumber(num1:Int,num2:Int)= if (num1>num2) num1 else num2
when
类似于switch,但是强于switch,变量不只局限于整形或者是字符串。而且不需要break语句。 【匹配值】->{执行逻辑},当执行逻辑只有一行代码,{}可以省略不写。而且when和if一样也是可以有返回值的,
//传统写法
fun getScore(name:String):Int {
var score =0
when(name){
"Tom"->{ score =66 } //不省略{}写法
"ANN"-> score =90 //省略写法
else -> score =0
}
return score
}
//语法糖写法 when整体是一个语句
fun getScore(name:String)= when(name){
"Tom"->66
"ANN"-> 90
else -> 0
}
//不带参数的when写法
fun getScore(name:String)= when(){
name=="Tom"->66 // 前面写匹配的条件
name== "ANN"-> 90
else -> 0
}
for in 循环
Lambda表达式
Lambda是一小段可以作为参数传递的代码片段。什么意思呢,通常写函数的时候,我们定义的参数是Int,String 啊之类的,但是现在写函数的时候我们可以选择传入的参数是一个Lambda的表达式,(也就是一小段代码作为参数)。实不相瞒,个人认为这个东东很像回调函数。
Lambda式子的语法结构,函数体中最后一行代码就是lambda的返回值
{参数名1:参数类型,参数名字:参数类型 -> 函数体}
以一个我写的无病呻吟的一个传入参数是Lambda表达式的函数textLambda为例子。
fun textLambda(test:(String) -> Int){
val str1="aaa"
val num= test(str1)
if (num>5) print("短字符串")
else print("长字符串")
}
那么调用的时候,我就要传入一个符合这个函数要求的lambda表达式
textLambda ({str1:String-> 8})
textLambda ({str1:String-> str1.length})
textLambda (){str1:String-> str1.length}
textLambda {str1:String-> str1.length}
textLambda {str1-> str1.length}
textLambda {it.length}
通过以上的例子就会发现,其实Lambda表达式和Int之类的没什么区别,Int代表的是一个值,但是Lambda代表的是一段代码罢了。对于参数是Lambda表达式的函数而言,它会告诉你它要一个Lambda表达式,然后这个表达式中它会告诉你,它将会给你一个什么类型的参数,然后它需要你返回给它一个什么类型的结果。至于中间的过程它一概不管。
JAVA函数式API
当kotlin调用java代码的时候,也可以使用JAVA函数式API。但是要满足以下条件:**调用的java方法接收一个java单抽象方法的接口参数。**以上的句子很难懂但是没关系,例子来解释,Android的java开发中经常要开线程,Thread方法很熟悉吧,就以他为例子。 解释:
java代码中,看下定义:Thread 方法,参数是Runnable 类型的参数
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
再看下Runnable 的定义,会发现它是一个接口,并且只有一个抽象方法也就是run方法。
public interface Runnable {
public abstract void run();
}
那么Thread方法它就是满足上面那段话的,首先Thread 是一个java方法,并且它接收的参数Runnable是一个接口,然后这个接口里面有一个抽象方法。
所以说当kotlin中调用Thread方法中那个接口参数的单抽象方法可以写成Lambda表达式
实战
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程");
}
});
Thread(object: Runnable {
override fun run() {
print("线程");
}
})
Thread( Runnable {
print("线程");
})
Thread( {
print("线程");
})
Thread() {print("线程")}
Thread{print("线程")}
|