kotlin与java对比
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
kotlin作為一個(gè)現(xiàn)代的適用于多平臺(tái)的靜態(tài)類型語(yǔ)言越來(lái)越受到j(luò)ava開(kāi)發(fā)同學(xué)的喜愛(ài),尤其是android開(kāi)發(fā)同學(xué)的喜愛(ài),下面從幾個(gè)方面淺析一下kotlin和java的一些比較。
Optionals:
在java開(kāi)發(fā)中我們經(jīng)常會(huì)遇到一個(gè)異常,就是NPE,也就是所謂的nullPointerException,這個(gè)異常號(hào)稱java最大的bug一直讓我們java開(kāi)發(fā)非常頭疼,大量的if判斷后者try cache捕獲異常讓我們的代碼變得很不優(yōu)雅,但是在kotlin中已經(jīng)完美的解決了該問(wèn)題,只需一個(gè)問(wèn)號(hào):?。新接觸kotlin的同學(xué)獲取對(duì)該語(yǔ)言中的?有太多的疑惑,所以不敢使用問(wèn)號(hào),下面簡(jiǎn)單說(shuō)一下:
在kolin中,一切都是對(duì)象,所有的變量和常量必須有初始值,而且kotlin中沒(méi)有基本數(shù)據(jù)類型,全是引用數(shù)據(jù)類型,也就是說(shuō)所用的變量都用可能為null,所以當(dāng)你為一個(gè)變量初始化時(shí),一定要有一個(gè)初始值,但是你的初始值一旦為null:
你的IDE一定會(huì)提示你報(bào)錯(cuò),那正確的寫(xiě)法應(yīng)該是:
那么該變量i就有可能為null.然后看下面的語(yǔ)句:
var map : HashMap<String,Any> ? = null //var empty = map!!.isEmpty() var empty = map?.isEmpty() //var empty = map?.isEmpty()?:false首先定義了一個(gè)HashMap,初始化為null,這個(gè)時(shí)候用map調(diào)用isEmpty()方法肯定會(huì)報(bào)錯(cuò)的,這個(gè)時(shí)候有兩種解決辦法,第一讓它拋出異常,用!!表示,第二用?,表示我知道它有可能為null,但是還是要執(zhí)行sEmpty()方法,大不了返回值empty也為null,第四條語(yǔ)句為,如果map?.isEmpty()為null,則為empty賦值為false,這就是Elvis表達(dá)式。
Stream和Lambdas表達(dá)式
java從jdk8開(kāi)始引入了stream和lambdas表達(dá)式,但是開(kāi)發(fā)者這種特性或者說(shuō)語(yǔ)法糖一直不感冒,當(dāng)年尤記得我在java代碼中使用stream對(duì)collection的filter操作后,技術(shù)總監(jiān)對(duì)我嚴(yán)厲的批評(píng),說(shuō)明java和java開(kāi)發(fā)者都是相對(duì)保守的。再者在android開(kāi)發(fā)中,雖然在Java 8和9中可以使用stream和lambdas,但在API 24以下的Android SDK中是不可用的,那也只能意味著放棄,但kotlin的出現(xiàn)讓這些語(yǔ)法糖沖新在android中得到了發(fā)揮。
請(qǐng)看下面三行代碼:
var array = arrayListOf(1,2,3,4,5,5,6,7,8,9,0,-1) var subArray = array.filter ({ item -> item > 0 }) var subArray2 = array.map { it + 10 }首先定義了一個(gè)變量array,類型為ArrayList<Int>,并add了一組數(shù)據(jù),這個(gè)時(shí)候我想要對(duì)這個(gè)集合做一些操作,比如說(shuō)篩選,那么在java中最常用的就是for循環(huán)或while循環(huán)遍歷,但是如果使用stream和lambdas表達(dá)式就是一行代碼搞定,也就是上面的第二行語(yǔ)句。
首先說(shuō)一下何為stream,其實(shí)就是對(duì)元素集合統(tǒng)一、快速、并行操作的一種方式,何為lambdas表達(dá)式:其實(shí)就是一個(gè)匿名函數(shù),支持函數(shù)式編程,有自己獨(dú)特的語(yǔ)法糖格式。
然后再看看array.filter()的源碼:
/*** Returns a list containing only elements matching the given [predicate].*/ public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate) }?
灰常簡(jiǎn)單,首先參數(shù)為一個(gè)匿名函數(shù)(匿名函數(shù)中有一個(gè)參數(shù)T,返回值為布爾類型),返回值為L(zhǎng)ist<T>。
在看android中的一段代碼:
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val text = findViewById(R.id.text) as TextViewtext.setOnClickListener { v ->Toast.makeText(this@MainActivity, "Hello", Toast.LENGTH_LONG).show()v.visibility = View.VISIBLE}} }當(dāng)為text設(shè)置一個(gè)監(jiān)聽(tīng)時(shí),我們習(xí)慣的寫(xiě)法是寫(xiě)一個(gè)匿名內(nèi)部類,但是在kotlin可以用lambdas表達(dá)式代替,但是只限于監(jiān)聽(tīng)接口只有一個(gè)方法實(shí)現(xiàn)。
Binding of views
這是一個(gè)具體的Android問(wèn)題,Jetbrains為我們提供了Kotlin Android擴(kuò)展,一個(gè)官方的支持庫(kù)通過(guò)一個(gè)gradle的插件來(lái)簡(jiǎn)化這個(gè)問(wèn)題(以及其他一些問(wèn)題)。
構(gòu)造器
在java中constructor相對(duì)kotlin比較靈活,在kotlin中,定義一個(gè)class時(shí),也會(huì)有一個(gè)默認(rèn)的構(gòu)造器,當(dāng)你自定一個(gè)構(gòu)造器時(shí)可以分為主構(gòu)造器和二級(jí)構(gòu)造器:
class Test constructor(name : String){var name : String ? = nullvar age : Int ? = nullconstructor(age : Int,name : String) : this(name)init {this.name = namethis.age = age} }但是,如果類有主構(gòu)造函數(shù),每個(gè)二級(jí)構(gòu)造函數(shù)都要,或直接或間接通過(guò)另一個(gè)二級(jí)構(gòu)造函數(shù)代理主構(gòu)造函數(shù)。在同一個(gè)類中代理另一個(gè)構(gòu)造函數(shù)使用this?關(guān)鍵字,如上面的代碼。
?
上面的幾點(diǎn)是我決得比較有意思的,并在實(shí)際開(kāi)發(fā)中會(huì)經(jīng)常的使用,java和kotlin當(dāng)然還有大量的差異,比如java中的static、this關(guān)鍵字在kotlin中如何實(shí)現(xiàn),java中的.class在kotlin中如何表示等等,這些都需要我們?cè)趯?shí)際開(kāi)發(fā)中慢慢了解和習(xí)慣。
?
?
轉(zhuǎn)載于:https://my.oschina.net/gef/blog/1582071
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的kotlin与java对比的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android 屏幕旋转时Activit
- 下一篇: Git学习系列之Git和Tortoise