自从谷歌宣布,kotlin为Android官方的开发语言,它确实火了,因为他有强大的背景,更因为它的安全,简洁
大部分的人会说,我的项目是java,换成kotlin那成本太大了.其实kotlin的开发者早就想到这一点,kotlin官网强调:与java100%的交互.
这让你想到什么?没错,这意味着你不用用kotlin重构整个项目,可以立刻马上现在就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() {
@Override
public Integer apply(String s) throws Exception {
return Integer.parseInt(s) + 1; //将"1"转成Integer,并加1
}
})
.subscribe(new Consumer() {
@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的.
细心的同学可能已经发现了,上面kotlin将String转成Int,只需要"1".toInt,写起来明显更符合面向对象的逻辑,不像java写起来有点繁琐.那么.toInt()的背后是什么呢?
//点进kotlin的源码一看,这货其实还是调用java的,并用kotlin的内联函数,保证不会因为函数入栈,出栈而带来性能损失,额...说得有点多
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" }
//计算出男生的个数
val count = list.count { it.sex == "男" }
//java写法
你可能会这样写
private boolean hasStudentLin(ArrayList 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漏掉了,导致多循环n次
}
}
kotlin用简单的操作符any,filter ,count就清楚了表达了你想要的逻辑,代码的可读性大大提高,健壮性在某种程度上来说,也算提高了,比如上面student.getName()为null的时候(其实你应该用"lin"来调equals),java的写法就挂掉了,而kotlin则不会。事实上,kotlin还有很多操作符,他们都很实用。
以上的对比只是冰山一角,还有很多没提及,比如kotlin最重要的空安全...后面再慢慢补充...