編輯:關於android開發
原文標題:Unleash functional power on Android (I): Kotlin lambdas
原文鏈接:http://antonioleiva.com/operator-overloading-kotlin/
原文作者:Antonio Leiva(http://antonioleiva.com/about/)
原文發布:2015-08-05
雖然Java 8中已包含一些函數式工具,且如你想象那樣Android開發者還不能夠立即(或許甚至根本不能)使用這些工具,但是如果恰當地使用,函數式編程依然是十分強的工具。為此許多其他編程語言正開始進行解決這個問題。
由於函數式編程依賴於函數和永恆性,所以函數調用總是返回相同的結果。通常,完美是在各方合理的平衡點上,所以大多數現代編程語言,如Kotlin或Scala,都在單一編程語言中,融合過程式編程和函數式編程方法,並在這兩方面擁有最為先進的理念。有些問題用函數式編程來解決更合適,而有些沿用過程式編程更直接。
Lambda表達式是定義匿名函數的簡單方法。由於Lambda表達式避免在抽象類或接口中編寫明確的函數聲明,進而也避免了類的實現部分,所以它是非常有用的。在Kotlin語言中,可以將一函數作為另一函數的參數。例如,可以將需要回調(callback)的函數簡單化為:
1 fun runAsync(callback: () -> Unit) { 2 ... 3 callback() 4 }
這個用法相當明確。完成一些轉換後(後續會看到的),函數的調用方式可以得到簡單化:
1 runAsync { toast("Finished") }
Kotlin語言的另一個出色方面是,允許用lambda表達式編寫接口,這樣可以巨大地簡化代碼。舉例說明更易明白,假設要編寫視圖的典型setOnClickListener()方法。
在Java語言中,接口代碼類似這樣:
1 public interface OnClickListener { 2 void onClick(View v); 3 }
然後,需要編寫匿名類實現這個接口:
1 view.setOnClickListener(new OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 Toast.makeText(v.getContext(), "Click", Toast.LENGTH_SHORT).show(); 5 } 6 });
這段代碼轉換到Kotlin語言(用Anko toast
函數)會是這樣:
1 view.setOnClickListener(object : OnClickListener { 2 override fun onClick(v: View) { 3 toast("Click") 4 } 5 })
如前所述,Kotlin語言允許對Java語言類庫進行一些優化,任何有接口的函數都可以由函數替代。就像定義setOnclickListener()方法那樣去運行:
1 fun setOnClickListener(listener: (View) -> Unit)
Lambda表達式由箭頭左側函數的參數(在圓括號裡的內容)定義的,將值返回到箭頭右側。在這個例子中,得到的View
返回給Unit
(無參數)。按此思路,可以上述代碼略做簡化:
1 view.setOnClickListener({ view -> toast("Click")})
美妙的差異!在定義函數時,必須在箭頭的左側用方括號,並指定參數值,而函數的執行代碼在箭頭右側。如果左側不使用參數,甚至可以省去左側部分:
1 view.setOnClickListener({ toast("Click") })
如果函數的最後一個參數是一個函數的話,可以將作為參數的函數移到圓括號外面:
1 view.setOnClickListener() { toast("Click") }
最終,如果函數是唯一的參數,還可以去掉圓括號:
1 view.setOnClickListener { toast("Click") }
與初期的Java語言代碼相比,代碼量小於原來的五分之一,且更容易理解。這實在是令人印象深刻。Anko給一個(本質上說是函數名的)簡化版本,由前面展示過的實現方法的擴展函數組成:
1 view.onClick { toast("Click") }
多虧有這些轉換,可以創建自己的生成器(builder)和代碼塊。Kotlin語言標准庫提供一些像with那樣有趣的函數。下面是更簡單的實現方式:
1 inline fun <T> with(t: T, body: T.() -> Unit) { t.body() }
這個函數會獲取一個類型T的對象和作為擴展函數使用的函數。實現的過程僅僅解決了對象,並讓對象執行函數。由於函數的第二個參數是另一個函數,所以可以將其移到括號外面。這樣可以直接使用對象的this
關鍵字創建
代碼塊,還能夠直接使用對象的公共屬性和函數:
1 with(forecast) { 2 Picasso.with(itemView.ctx).load(iconUrl).into(iconView) 3 dateView.text = date 4 descriptionView.text = description 5 maxTemperatureView.text = "${high.toString()}º" 6 minTemperatureView.text = "${low.toString()}º" 7 itemView.onClick { itemClick(forecast) } 8 }
Lambda表達式的能量在於我們的想象力。如果沒有用過函數式編程方法,就需要大量的實踐,這樣做是值得的。如果你要進一步學習lambda表達式和Kotlin相關內容,可從我編寫的書中獲得。
Android 手機衛士--導航界面3、4和功能列表界面跳轉邏輯處理,android4和剛剛花了一點時間,將導航界面3、4的布局和相應的跳轉邏輯寫了一下: Setup3
viewflipper動畫切換屏幕,viewflipper動畫切換 整個項目的 package com.example.viewflipper; imp
關於安卓APP的啟動界面,安卓APP啟動界面剛學安卓App開發的朋友們,可能會遇到一個問題,就是人家的App剛進入會有一個頁面出現一會兒後消失, 這個頁面
淺析MySQL數據庫OLTP基准測試sysbench是一款非常優秀的基准測試工具,它能夠精准的模擬MySQL數據庫存儲引擎InnoDB的磁盤的I/O模式。因此,基於sys