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