自從谷歌宣布,kotlin為Android官方的開發(fā)語言,它確實火了,因為他有強大的背景,更因為它的安全,簡潔
大部分的人會說,我的項目是java,換成kotlin那成本太大了.其實kotlin的開發(fā)者早就想到這一點,kotlin官網強調:與java100%的交互.
這讓你想到什么?沒錯,這意味著你不用用kotlin重構整個項目,可以立刻馬上現(xiàn)在就kotlin寫Android了.接下來我們來看看kotlin...
//Student,Teacher的實體類聲明
data class Student(val name: String, val age: Int, val sex: String)
data class Teacher(val name: String, val age: Int, val sex: String)
沒錯,你再也不用寫枯燥無味的get/set方法了,我們在看一段RxJava代碼
//java寫法,
Observable.just("1")
.map(new Function<String, Integer>() {
@Override
public Integer apply(String s) throws Exception {
return Integer.parseInt(s) + 1; //將"1"轉成Integer,并加1
}
})
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(integer); //打印2
}
});
//kotlin寫法
Observable.just("1")
.map { it.toInt() + 1 } //String轉Int,并+1
.subscribe { println(it) } //打印結果:2
從上面可以看出kotlin支持lambda表達式,而java是java8才開始支持,Android是不支持java8的.
細心的同學可能已經發(fā)現(xiàn)了,上面kotlin將String轉成Int,只需要"1".toInt,寫起來明顯更符合面向對象的邏輯,不像java寫起來有點繁瑣.那么.toInt()的背后是什么呢?
//點進kotlin的源碼一看,這貨其實還是調用java的,并用kotlin的內聯(lián)函數(shù),保證不會因為函數(shù)入棧,出棧而帶來性能損失,額...說得有點多
public inline fun String.toInt(): Int = java.lang.Integer.parseInt(this)
類型自動推導
//你可以不用生聲明類型
private val age = 1 //用val聲明一個不可變的字段(常量)
private var name = "lin" //用var聲明一個變量
事實上,值不可變的字段,你應該用val聲明.在java中,你應該用final關鍵字修飾.這樣你維護代碼的時候,一眼看到這個字段就知道它不可能在其他地方被賦值了,如果你不是這樣做,修bug,維護這個字段的時候你得小心翼翼.這就是val聲明的好處
java的switch 與 kotlin的when
//java代碼
switch (age) {
case 1:
System.out.println("剛出生?");
break;
case 2:
case 3:
System.out.println("長大了");
break;
default:
System.out.println("翅膀硬了...");
}
//kotlin代碼
when (age) {
1 -> println("剛出生?")
2, 3 -> println("長大了")
else -> print("翅膀硬了...")
}
你還記得你上一次在java中少寫了一個break,而導致的bug嗎? 當然kotlin的when還有更強大的操作.
集合操作符
//kotlin寫法
//聲明一個Student集合
val list = listOf(Student("lin", 1, "男"),
Student("zhang", 2, "女"),
Student("san", 3, "妖怪"),
Student("四", 4, "未知"))
//過濾出所有年齡大于2的學生
val filterStudents = list.filter { age > 2 }
//判斷是否有一個名字叫"lin"的學生,如果有返回true,反之false
val hasStudentLin = list.any { it.name == "lin" }
//計算出男生的個數(shù)
val count = list.count { it.sex == "男" }
//java寫法
你可能會這樣寫
private boolean hasStudentLin(ArrayList<Student> students) {
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
if (student.getName().equals("lin")) {
return true;
}
}
return false;
}
//你還可能這樣寫
boolean hasStudentLin;
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
if (student.getName().equals("lin")) {
hasStudentLin = true;
break; //是不是有可能你一不小心把break漏掉了,導致多循環(huán)n次
}
}
kotlin用簡單的操作符any,filter ,count就清楚了表達了你想要的邏輯,代碼的可讀性大大提高,健壯性在某種程度上來說,也算提高了,比如上面student.getName()為null的時候(其實你應該用"lin"來調equals),java的寫法就掛掉了,而kotlin則不會。事實上,kotlin還有很多操作符,他們都很實用。
以上的對比只是冰山一角,還有很多沒提及,比如kotlin最重要的空安全...后面再慢慢補充...