为什么要使用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和携程进行详细的介绍。

df7da83ea7648fdeb9963e9552ba2425.gif

猜你喜欢

转载自juejin.im/post/7130198991106637832