为什么要使用Kotlin 对比 Java,Kotlin简介
什么是Kotlin
打开Kotlin编程语言的官网,里面大大的写着,
A modern programming languagethat makes developers happier.
是一门让程序员写代码时更有幸福感的现代语言
- Kotlin语法糖非常多,可以写出更为简洁的代码,便于阅读。
- Kotlin提供了空安全的支持,可以的让程序更为稳定。
- Kotlin提供了协程支持,让异步任务处理起来更为方便。
- Google:Kotlin-first,优先支持kotlin,使用kotlin可以使用更多轮子
接下来对比Java举一些例子。
简洁
当定义一个网络请求的数据类时
Java
public class JPerson {
private String name;
private int age;
//getter
//setter
//hashcode
//copy
//equals
//toString
}
Kotlin
data class KPerson(val name: String,val age: Int)
这里用的是Kotlin 的data class
在class 前面加上data
修饰后,kotlin会自动为我们生成上述Java类注释掉的部分
当我们想从List中筛掉某些我们不想要的元素时
Java
List<Integer> list = new ArrayList<>();
List<Integer> result = new ArrayList<>();
for (Integer integer : list) {
if (integer > 0) { //只要值>0的
result.add(integer);
}
}
System.out.println(result);
Kotlin
val list: List<Int> = ArrayList()
println(list.filter { it > 0 })
如上代码,都能达到筛选List中 值>0 的元素的效果。
这里的filter
是Kotlin提供的一个拓展函数,拓展函数顾名思义就是拓展原来类中没有的函数,当然我们也可以自定义自己的拓展函数。
当我们想写一个单例类时
Java
public class PersonInJava {
public static String name = "Jayce";
public static int age = 10;
private PersonInJava() {
}
private static PersonInJava instance;
static {
instance = new PersonInJava();
}
public static PersonInJava getInstance() {
return instance;
}
}
Kotlin
object PersonInKotlin {
val name: String = "Jayce"
val age: Int = 10
}
是的,只需要把class
换成object
就可以了,两者的效果一样。
还有很多很多,就不一一举例了,接下来看看安全。
安全
空安全
var name: String = "Jayce" //name的定义是一个非空的String
name = null //将name赋值为null,IDE会报错,编译不能通过,因为name是非空的String
var name: String? = "Jayce" //String后面接"?"说明是一个可空的String
name.length //直接使用会报错,需要提前判空
//(当然,Kotlin为我们提供了很多语法糖,我们可以很方便的进行判空)
类型转换安全
fun gotoSleep(obj: Any) {
if (obj is PersonInKotlin) {//判断obj是不是PersonInKotlin
obj.sleep() // 在if的obj已经被认为是PersonInKotlin类型,所以可以直接调用他的函数,调用前不需要类型转换
}
}
协程
这里只是简单的举个例子
Kotlin的协程不是传统意义上那个可以提高并发性能的协程序
官方的对其定义是这样的
- 协程是一种并发设计模式,您可以在Android平台上使用它来简化异步执行的代码
- 程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。
当我们用Java请求网络数据时,一般是这么写的。
getPerson(new Callback<Person>() {//这里有一个回调
@Override
public void success(Person person) {
runOnUiThread(new Runnable() { //切换线程
@Override
public void run() {
updateUi(person)
}
})
}
@Override
public void failure(Exception e) {
...
}
});
有Kotlin协程后我们只需要这么写
CoroutineScope(Dispatchers.Main).launch { //启动一个协程
val person = withContext(Dispatchers.IO) {//切换IO线程
getPerson() //请求网络
}
updateUi(person)//主线程更新UI
}
他们两个都干的同一件事,最明显的区别就是,代码更为简洁了,如果在回调里面套回调的话回更加明显,用Java的传统写法就会造成人们所说的CallBack Hell。
除此之外协程还有如下优点
- 轻量
- 更少的内存泄漏
- 内置取消操作
- 集成了Jatpack
这里就不继续深入了,有兴趣的同学可以参考其他文章。
Kotlin-first
在Google I/O 2019的时候,谷歌已经宣布Kotlin-first
,建议Android开发将Kotlin作为第一开发语言。
为什么呢,总结就是因为Kotlin简洁、安全、兼容Java、还有协程。
至于有没有其他原因,我也不知道。(手动狗头)
Google将为更多的投入到Kotlin中来,比如
为Kotlin提供特定的APIs (KTX, 携程, 等)
提供Kotlin的线上练习
示例代码优先支持Kotlin
Jetpack Compose,这个是用Kotlin开发的,没得选。。。。。
跨平台开发,用Kotlin实现跨平台开发。
好的Kotlin就先介绍到这里,感兴趣的同学就快学起来吧~
接下来在其他文章会对Kotlin和携程进行详细的介绍。
链接:https://juejin.cn/post/7130198991106637832
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。