快速切換至Kotlin for Android模式

前言

幾個特性,快速上手Kotlinjava

充分理解Kotlin,快速上手寫業務app

快速切換至Kotlin for Android模式ide

聊一聊Kotlin中的協程,真香工具

關於Kotlin的文章,已經構思了好久。一直不知道該怎麼寫。文檔式文章?那不如直接看文檔,何須須要我再多「嗶嗶」呢。思來想後,決定寫一篇快速在Android開發中感覺Kotlin的其妙的文章。post

說實話,最開始搞Kotlin我是拒絕的。爲啥?由於徹底沒有感受到用它替換Java開發有什麼實質性的改變;並且感受語法很「彆扭」!(其實說白了,就是不想學,給本身找藉口。哈哈)學習

可是,後來機緣巧合卻感覺到了Kotlin的有趣之處。固然這一切的開始,要克服寫久了Java的那一種「彆扭」(由其是在Lambda寫的也很少的狀況下)。OK,不扯了。文章將從我接觸Kotlin時,遇到「彆扭」的地方開始展開。ui

正文

靜態方法

第一個讓我懵逼的是靜態方法。在Kotlin裏邊被叫作了:伴生對象。這裏不扯「花裏胡哨」的介紹。直接上代碼:this

public class StringUtils{
	public static void myFun(){
		Log.d("StringUtils","Haha");
	}
}
複製代碼

在Java中這麼一個簡單工具類中的靜態方法,Kotlin要怎麼寫?spa

class StringUtils{
    companion object {
        fun myFun(){
            Log.d("StringUtils","Haha")
        }
    }
}
複製代碼

匿名內部類

setOnClickListener是咱們比較經常使用的匿名內部類的使用場景:code

btn.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Log.d("Listener","Haha")
	}
}
複製代碼

那麼到了Kotlin中又是什麼樣子了呢?

btn.setOnClickListener {
	Log.d("Listener","Haha")
}
複製代碼

直接幫咱們Lambda化了。若是咱們不想Lambda化那應該是什麼樣子?

btn.setOnClickListener(object : View.OnClickListener{
	override fun onClick(v: View?) {
		Log.d("Listener","Haha")
	}
})
複製代碼

也沒什麼特別的,其實就是Kotlin的語法。由於Kotlin裏邊聲明的變量要寫在前面,其類型用:號隔開,寫在後面。也就是如今這個樣子。不過須要注意的,這裏的object表明匿名對象類型。

這裏有一個小細節,不知道大兄弟們有沒有注意到。在Java中咱們new匿名內部類的時候:new View.OnClickListener(){},是有()的。而在Kotlin中則:View.OnClickListener{}沒有()。這裏也是屬於語法細節,加上()表示顯示的調用這個類的構造方法。

若是這樣的話,那就和new普通的類,沒什麼區別的(而不是匿名內部類)。藉着匿名內部類,咱們直接來看一下Kotlin在RxJava中的實戰。

Kotlin in RxJava

先看一個很簡單的Java用法:

Observable.just(0)
          .map(new Function<Integer, String>() {
              @Override
              public String apply(Integer integer) throws Exception {
                  return integer.toString();
              }
          })
          .subscribe(new Consumer<String>() {
              @Override
              public void accept(String s) throws Exception {
	              Log.d("RxJava", s);
              }
          }, new Consumer<Throwable>() {
              @Override
              public void accept(Throwable throwable) throws Exception {
	              Log.d("RxJava", throwable.getMessage());
              }
          });
複製代碼

對於Kotlin來講,在Lambda的加持之下,寫法變得異常的簡潔(固然Java進行Lambda化也很簡潔):

Observable.just(0)
          .map({ it!!.toString() })
          .subscribe({ t: String -> Log.d("RxJava", t)
          }, { t: Throwable -> Log.d("RxJava", t.message) })
複製代碼

若是對Lambda不是很熟悉的大兄弟們,確定有點懵。那麼我們換成普通的kotlin,,是否是感受很熟悉?object又出現了,沒錯這裏就是普通的匿名內部類而已。

Observable.just(0)
          .map(object : Function<Int, String> {
              override fun apply(t: Int): String {
                  return t.toString()
              }
          })
          .subscribe(object : Consumer<String> {
              override fun accept(t: String) {
                  Log.d("RxJava", t)
              }
          }, object : Consumer<Throwable> {
              override fun accept(t: Throwable) {
                  Log.d("RxJava", t.message)
              }
          })
複製代碼

Kotlin in Adapter

上述的幾塊代碼,咱們一塊兒感覺了Kotlin在RxJava中的變形。說實話,若是拋出Lambda,真心談不上什麼大的變化。就是語法上的轉變。聊過了咱們平常開發比重比較大的RxJava,接下來咱們再來看一看另外一個重頭戲Adapter。這裏直接上Kotlin代碼:

class TestAdapter(var data: List<String>,var context:Context) : RecyclerView.Adapter<TestAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        return ViewHolder(TextView(context))
    }

    override fun getItemCount(): Int {
        return data.size
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        holder!!.textView.text = "Haha"
    }

    class ViewHolder(var textView: TextView) : RecyclerView.ViewHolder(textView)
}
複製代碼

最開始看這個代碼的時候,我是有點懵的,感受不知所措。其實帶入Kotlin的語法,很是的好理解。在最開始聲明這個class的時候,咱們直接在TestAdapter的主構造方法中聲明瞭兩個var的變量。這種寫法就相似於Java中的:

class TestAdapter {
    public List<String> data;
    public Context context;

    public TestAdapter(List<String> data, Context context) {
        this.data = data;
        this.context = context;
    }
}
複製代碼

這也就是爲何咱們能在class裏邊隨意調用data和context的緣由。

注意var,若是咱們在構造方法中聲明時不加上var,就能夠理解爲這個變量是局部變量。只適用於構造方法中。

這中間override的代碼應該沒什麼好說的,咱們來看一下最後聲明的class ViewHolder。正常來講咱們在Java中的ViewHolder都是這個樣子:

public class ViewHolder extends RecyclerView.ViewHolder {
    public TextView textView;

    public ViewHolder(TextView textView) {
        super(textView);
        this.textView= textView;
    }
}
複製代碼

那爲何到了Kotlin之中,就變成了短短的一行class ViewHolder(var textView: TextView) : RecyclerView.ViewHolder(textView)了呢?其實也沒有什麼神奇的,就是正常語法而已。 這小結開始的時候,咱們提到了主構造方法,以及在匿名內部類這個小結中提到加上()表示顯示的調用這個類的構造方法。 所以Kotlin的這段代碼很是的好理解:

就是把主構造方法中傳遞的textView,傳給RecyclerView.ViewHolder()構造方法中。也就是和咱們的Java代碼一毛同樣的,只是寫法不一樣罷了。

尾聲

OK,關於Kotlin在咱們Android開發這些彆扭的地方就暫時寫到這。其實說白了,這些都是最基本的語法問題。這裏挑出來的這幾個Android的場景,是我在自覺得學會語法的時候,以爲彆扭的地方。固然彆扭的緣由仍是由於本身對語法並不夠理解。因此纔有了這篇文章,但願能夠給正準備走上Kotlin這條路上的大兄弟們一些幫助吧~

我是一個應屆生,最近和朋友們維護了一個公衆號,內容是咱們在從應屆生過渡到開發這一路所踩過的坑,以及咱們一步步學習的記錄,若是感興趣的朋友能夠關注一下,一同加油~

我的公衆號:鹹魚正翻身
相關文章
相關標籤/搜索