kotlin與java對比 原

kotlin作爲一個現代的適用於多平臺的靜態類型語言越來越受到java開發同學的喜愛,尤其是android開發同學的喜愛,下面從幾個方面淺析一下kotlin和java的一些比較。

Optionals:

在java開發中我們經常會遇到一個異常,就是NPE,也就是所謂的nullPointerException,這個異常號稱java最大的bug一直讓我們java開發非常頭疼,大量的if判斷後者try cache捕獲異常讓我們的代碼變得很不優雅,但是在kotlin中已經完美的解決了該問題,只需一個問號:?。新接觸kotlin的同學獲取對該語言中的?有太多的疑惑,所以不敢使用問號,下面簡單說一下:

在kolin中,一切都是對象,所有的變量和常量必須有初始值,而且kotlin中沒有基本數據類型,全是引用數據類型,也就是說所用的變量都用可能爲null,所以當你爲一個變量初始化時,一定要有一個初始值,但是你的初始值一旦爲null:

你的IDE一定會提示你報錯,那正確的寫法應該是:

那麼該變量i就有可能爲null.然後看下面的語句:

var map : HashMap<String,Any> ? = null
//var empty = map!!.isEmpty()
var empty = map?.isEmpty()
//var empty = map?.isEmpty()?:false

首先定義了一個HashMap,初始化爲null,這個時候用map調用isEmpty()方法肯定會報錯的,這個時候有兩種解決辦法,第一讓它拋出異常,用!!表示,第二用?,表示我知道它有可能爲null,但是還是要執行sEmpty()方法,大不了返回值empty也爲null,第四條語句爲,如果map?.isEmpty()爲null,則爲empty賦值爲false,這就是Elvis表達式。

Stream和Lambdas表達式

java從jdk8開始引入了stream和lambdas表達式,但是開發者這種特性或者說語法糖一直不感冒,當年尤記得我在java代碼中使用stream對collection的filter操作後,技術總監對我嚴厲的批評,說明java和java開發者都是相對保守的。再者在android開發中,雖然在Java 8和9中可以使用stream和lambdas,但在API 24以下的Android SDK中是不可用的,那也只能意味着放棄,但kotlin的出現讓這些語法糖衝新在android中得到了發揮。

請看下面三行代碼:

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 }

首先定義了一個變量array,類型爲ArrayList<Int>,並add了一組數據,這個時候我想要對這個集合做一些操作,比如說篩選,那麼在java中最常用的就是for循環或while循環遍歷,但是如果使用stream和lambdas表達式就是一行代碼搞定,也就是上面的第二行語句。

首先說一下何爲stream,其實就是對元素集合統一、快速、並行操作的一種方式,何爲lambdas表達式:其實就是一個匿名函數,支持函數式編程,有自己獨特的語法糖格式。

然後再看看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)
}

 

灰常簡單,首先參數爲一個匿名函數(匿名函數中有一個參數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 TextView
        text.setOnClickListener { v ->
            Toast.makeText(this@MainActivity, "Hello", Toast.LENGTH_LONG).show()
            v.visibility = View.VISIBLE
        }
    }
}

當爲text設置一個監聽時,我們習慣的寫法是寫一個匿名內部類,但是在kotlin可以用lambdas表達式代替,但是只限於監聽接口只有一個方法實現。

Binding of views

這是一個具體的Android問題,Jetbrains爲我們提供了Kotlin Android擴展,一個官方的支持庫通過一個gradle的插件來簡化這個問題(以及其他一些問題)。

構造器

在java中constructor相對kotlin比較靈活,在kotlin中,定義一個class時,也會有一個默認的構造器,當你自定一個構造器時可以分爲主構造器和二級構造器:

class Test constructor(name : String){
    var name : String ? = null
    var age : Int ? = null
    constructor(age : Int,name : String) : this(name)
    init {
        this.name = name
        this.age = age
    }
}

但是,如果類有主構造函數,每個二級構造函數都要,或直接或間接通過另一個二級構造函數代理主構造函數。在同一個類中代理另一個構造函數使用this 關鍵字,如上面的代碼。

 

上面的幾點是我決得比較有意思的,並在實際開發中會經常的使用,java和kotlin當然還有大量的差異,比如java中的static、this關鍵字在kotlin中如何實現,java中的.class在kotlin中如何表示等等,這些都需要我們在實際開發中慢慢了解和習慣。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章