/*
在Kotlin中,变量只分为val和var.
而val变量只能被赋值一次,相当于在初始化进行赋值后,后续就不能改动该变量。
而var变量是能够重复赋值。
例:
val a = 1
var a1 = 2
在Kotlin中,常用的变量类型有:
Int (整数类型)
String (字符串类型)
Boolean (布尔值类型)
Double (浮点数类型)
*/
2.Kotlin中的函数
函数声明:
fun+ 函数名(参数类型):返回值
例子:funxiaosu(su:String):Int
这个例子是说有一个su函数接受String类型的参数,而在返回值返回Int类型数值
funxiaosu()="xiaosu"
也可以这样写成不带任何参数,而返回"xiaosu"
或者可以写成
funxiaosu(su:String)= su
这样相当于
funxiaosu(su:String):String
{return su
}
3.Kotlin中的条件语句
Kotlin中的条件语句分为If和When 语句
例子:if(a1>b1){
所要执行的逻辑
}else{
所要执行的逻辑
}if条件语句还能跟赋值语句结合,例如:
val a1 =if(a1>b1){
num1
}else{
num2
}
这里逻辑很简单,如果a1>b1 则返回num1 给a1,否则返回num2
如果这样也可以跟函数结合,例如:
funsu(a1:Int,b1:Int)=if(a1>b1) a1 else b1
这里相当于传进两个整形参数,进行比较,那个大就返回那个
Kotlin中的When语句相当于匹配:when(num1){"xiaosu"->println("num1 is xiaosu")"xiaosu3"->println("num1 is xiaosu3")else->println("num1 is null")}
也可以进行类型匹配
funcheckNumber(num:Number){when(num){is Int ->println("num is Int")else->println("num is not support")}}when控制语句也能跟函数和赋值语句进行
funxiaosu(num1:String)=when(num1){"xiaosu"->77else->0}
4.Kotlin的循环语句
Kotlin中的循环语句就理解为For语句行,例子:
for(i in0..10)
或者可以这样写
for(i in0 until 10 step 2) 这个循环语句说明i 在0到10的范围中循环,并且按照每次自增2进行
val a1 =0 until 10for(i in a1) 也能这样写
如果For语句无法满足一些场景,也可以使用While语句,但是实在太少用了,不做介绍了。
5.Kotlin中的面向对象编程
创建一个类:
classxiaosu(){var a1 =""var a2 =0funxiaosu1()}
实例化一个类:
val su =xiaosu()
su.a1 ="xiaosu"
su.a2 =1
su.xiaosu1()
创建继承类:openclassxiaosu()
继承类的用法:class xiaosu2:xiaosu()
这里后面被继承的类中带有括号是需要注意的,因为这个跟类的主次构造函数有关
首先类中都会自带一个无参构造函数,无论你是否声明在创建类的时候会自动分配一个
而主构造函数是没有函数体的,所以一般只要给类传进参数就会实现。
classxiaosu2(val su1:String,val su2:String):xiaosu()
而如果想要在主构造函数中实现逻辑实现,就需要借助Init函数了
classxiaosu2(val su1:String,val su2:String):xiaosu(){init{println("xiaosu is cool boy")}//这里提醒一下Init函数体中不适合写长逻辑语句,所以建议实现短逻辑}
这里举一个继承类所会出现的问题
openclassxiaosu(val name1:String,val name2:String)classxiaosu2(val name:String,val age:String):Person()
如果这样子去写,会出现语法错误,因为你所继承的类带有参数类型,你在声明该类,需要构造父类,而父类带有参数类型,他的无参构造已经不适用
所以必须要给父类传参数,所以这里需要这样改。
class xiaosu2(val name:String,val age:String,name1:String,name2:String):Person(name1,name2)
这里提醒一下不能将name和age赋值给Person类,因为他已经被声明了val,说明他就属于xiaosu2这个类了。
讲完主构造函数,现在讲一下次构造函数。
任何一个类只能有一个主构造函数,但是可以有多个次构造函数
次构造函数需要借助constructor这个函数名来实现
例如:
class xiaosu2(val name:String,val age:String,name1:String,name2:String):Person(name1,name2){constructor(name:String,age:String):this("","","",""){}constructor():this("xiaosu","xiaosu"){}
这里解释一下为何这样写,因为Kotlin是可以同时允许主构造函数和次构造函数存在,但是次构造函数必须要初始化主构造函数
第一个次构造函数初始化了主构造函数,但是第二个却是无参,但是他初始化了第一个次构造函数,所以他这是合法。
}
以及还有一种特殊情况,就是没有显示定义主构造函数,只有次构造函数时:
class xiaosu1:xiaosu{constructor(name:String,age:Int):super(name,age)}
这里代表着如果xiaosu1没有主构造函数,那么也不用去调用父类的主构造函数了,通过次构造函数+super去调用即可。
6.Kotlin的Lambda编程
这里Lambda编程主要针对Map Set 和List这几类,我这里也简单介绍一下。
List一般处理的是ArrayList和LinkedList,大部分的时候都是使用ArrayList
Set一般处理的是HashSet
Map一般处理的是HashMap
List的声明:
val l1 = ArrayList<String>()
l1.add("xiaosu")
也可以这样写
val l1 =listOf("xiaosu")
这种写法,只能初始化添加一次,后续不能通过add来使用,但是可以通过mutableListOf来声明
val l1 =mutableListOf("xiaosu")
l1.add("xiaosu")
遍历List的方法通过for循环
for(i in l1) println(i)
Set的声明
val a1 =setOf("1")
也可以写成
val a1 =mutableSetOf("xiaosu")
他的规律跟List差不多一样,所以不多介绍
Map的声明
val a1 = HashMap<String:Int>()
a1.put("小苏",1)
也可以这样添加元素
a1["xiaosu"]=1
他也拥有mapOf和mutableMapOf这两种声明方法,也不做太多介绍了
那么现在开始介绍Lambda编程的神奇之处,这里给出一个例子
val l1 =listOf("xiaosu","xiaosu2","xiaosu3")val Lambda ={fruit:String->fruit.length}val numberMaxList = l1.maxBy(Lambda)
这上述语句是寻找l1中的列表中的长度最大的元素
这里一步一步解析:
1.首先先声明一个listOf类型的列表赋值给li
2.声明一个Lambda语法,Lambda语法的结构为 {变量名:变量类型->函数体},这里我们声明了一个fruit的String变量,函数体则寻找String变量的长度
3.将这个Lambda给List中的maxBy这个函数中,这个函数是List自带的,我们将这个Lambda逻辑赋值给maxBy(),那么他将会寻找长度最长的字符,按照这个逻辑。
然后还可以继续对Lambda语句进行简化。
val numberMaxList = l1.maxBy({fruit:String -> fruit.length})
这里根据Kotlin的一个特性,当一个函数Lambda参数是最后一个参数时,可以将该参数放置括号外
val numberMaxList = l1.maxBy(){fruit:String -> fruit.length}
这里根据Kotlin另一个特性,当函数中Lambda参数是唯一一个参数时,可以将函数括号去掉
val numberMaxList = l1.maxBy{fruit:String->fruit.length}
这里根据Kotlin的另一个特性,当函数中的Lambda结构体中只可以不声明该参数类型
val numberMaxList = l1.maxBy{fruit->fruit.length}
这里根据Kotlin的另一个特性,当函数中的Lambda结构体中只有一个参数,那么我们可以用it代替他
val numberMaxList = l1.maxBy{it.length}