幾個特性,快速上手Kotlinjava
關於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{}
沒有()。這裏也是屬於語法細節,加上()表示顯示的調用這個類的構造方法。
先看一個很簡單的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在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的這段代碼很是的好理解:
OK,關於Kotlin在咱們Android開發這些彆扭的地方就暫時寫到這。其實說白了,這些都是最基本的語法問題。這裏挑出來的這幾個Android的場景,是我在自覺得學會語法的時候,以爲彆扭的地方。固然彆扭的緣由仍是由於本身對語法並不夠理解。因此纔有了這篇文章,但願能夠給正準備走上Kotlin這條路上的大兄弟們一些幫助吧~