本帖用于记录安卓开发kotlin的学习。
编程语言大致可以分为两类:编译型语言和解释型语言。
编译型语言:编译器会将我们编写的源代码一次性地编译成计算机可识别的二进制文件。比如C和C++.
解释型语言:有一个解释器,在程序运行时,解释器会一行行地读取我们编写的源代码,然后实时地将这些源代码解释称计算机可识别的二进制数据后再执行,效率较差。比如Python、JavaScript.
Kotlin的优点:
1、语法更简洁,代码量想对JAVA减少50%甚至更多。
2、语法更高级,增加许多高级语言的语法特性,开发效率提升。
3、安全性更高,几乎杜绝了空指针异常。
定义变量:
val (value):声明一个不可变的变量,对应Java中的final变量。
var (variable):声明一个可变的变量,对应Java中的非final变量。
fun main(){
var a : Int = 10
println("a=" + a)
}
输出a=10
注意:结尾不加分号。
if条件语句:
fun largerNumber(num1 : Int , num2 : Int) : Int {
var value = 0
if(num1 > num2){
value = num1
}else{
value = num2
}
return value
}
可以简化为:
fun largerNumber(num1:Int,num2:Int ) = if (num1 > num2) num1 else num2
when条件语句:
fun getScore(name:String) = if (name == "Tom"){
86
}else if (name == "Jim"){
77
}else if (name == "Jack"){
95
}else if (name == "Lily"){
100
}else{
0
}
可简化为:
fun getScore(name:String) = when (name){
"Tom" -> 86
"Jim" -> 77
"Jack" -> 95
"Lily" -> 100
else -> 0
}
除了精确匹配以外,when语句还可以进行类型匹配:
fun checkNumber(num : Number){
when(num){
is Int -> println("number is Int")
is Double -> println("number is Double")
else -> println("number not support")
}
}
注:kotlin中判断字符串或对象是否相等可以直接用"==",而不是像java那样要调用equals()方法
for循环语句:
fun main(){
for(i in 0..10){
println(i)
}
}
输出结果为0 1 2 3 4 5 6 7 8 9 10
由于数组下标都是0开始,所以需要用until关键字
until关键字可以创建一个左闭右开的升序(降序区间用关键字downTo)区间,如下区间是[0,10)
step 2相当于每次循环都会在区间范围内递增2,相当于i=i+2的效果
fun main(){
for(i in 0 until 10 step 2){
println(i)
}
}
输出结果
0 2 4 6 8
在kotlin中任何一个非抽象类默认都是不可以被继承的,相当于JAVA中给类设了final关键字。原因于val关键字差不多。若要创建一个能被继承的类,需要在类的前面添加open关键字,如下:
open class Person{
...
}
继承方法是一个冒号,如下:
class Student : Person(){
var sno = ""
var grade = 0
}
数据类的生成只需要一行代码:
data class Cellphone(val brand:String , val price:Double)
测试:
fun main (){
val cellphone1 = Cellphone("Samsung",1299.99)
val cellphone2 = Cellphone("Samsung",1299.99)
println(cellphone1)
println("cellphone1 equals cellphone2" + (cellphone1 == cellphone2))
}
输出结果:Cellphone(brand=Samsung,price=1299.99)
cellphone1 equals cellphone2 true
JAVA单例模式例子:P60
Kotlin单例模式:New->Kotlin File/Class 输入Singleton 选择Object 点击“OK”
object Singleton{
fun singletonTest(){
println("singletonTest is called.")
}
}
调用:Singleton.singletonTest()
集合的创建与遍历:
fun main(){
val list = listOf("Apple","Banana","Orange","Pear","Grape")
for(fruit in list){
println(fruit)
}
}
listOf()函数创建的集合是不可变的集合,只能用于读取,不能进行增删改操作。可变的集合创建如下:
fun main(){
val list = mutableListOf("Apple","Banana","Orange","Pear","Grape")
list.add("Watermelon")
for(fruit in list{
println(fruit)
}
}
Set的操作跟List一样,只不过创建集合的方式改为了setOf()和mutableSetOf()
Map:
val map = Hashmap<String,Int>()
map.put("Apple",1)
map.put("Banana",2)
map.put("Orange",3)
map.put("Pear",4)
map.put("Grape",5)
或者
val map = Hashmap<String,Int>()
map["Apple"] = 1
map["Banana"] = 2
map["Orange"] = 3
map["Pear"] = 4
map["Grape"] = 5
取值:
val number = map["Apple"]
或者
val map = mapOf("Apple" to 1,"Banana" to 2,"Orange" to 3,"Pear" to 4,"Grape" to 5)
示例:
fun main(){
val map = mapOf("Apple" to 1,"Banana" to 2,"Orange" to 3,"Pear" to 4,"Grape" to 5)
for((fruit,number) in map ){
println("fruit is" + fruit + ",number is" + number)
}
}
集合的函数式API(P65):
maxBy:集合的最大值
toUpperCase(): 所有元素转为大写
filter():过滤
any:集合中至少有一个元素满足指定条件
all:集合中全部元素满足指定条件
JAVA函数式API的使用(P69):
创建子线程:
new Thread(new Runnable(){
@Override
public void run(){
println("Thread is run!")
}
}).start()
可简化为:
Thread{
println("Thread is run!")
}.start()
点击事件:
button.setOnClickListener{
//点击事件
}
空指针:P71
fun doStudy(study : Study?){
study?.let{stu ->
stu.readBooks()
stu.doHomework()
}
}
?.操作符表示对象为空的时候什么都不做,对象不为空的时候就调用let函数,这样就可以保证let传递的对象不是空。