Kotlin,其語法來自: Swift, C#, Go?
優點:
- 非常簡潔的語法,程式碼量銳減,老闆要扣薪水了!
- 與Java程式碼互動非常容易和簡單
- 更好的泛型
- 安全的null運算, 跟Swift的一樣
- 更好的Lambda支援
- 方法(函式)為一級公民
- 擴充套件方法
- inline
- 還有一系列的語法糖: range, data class 等
以下是我在專案中的一些實踐:
1, 對String進行擴充套件方法後,網路請求變成了這樣
// 非同步搜尋App
fun searchApps(callback: (AppInfo?) -> Unit) {
var url = "http://www.xxxx.com/app/"
url.addHeader("user-agent", "kotlin")
.addQueryString("q", "GooglePlay")
.httpGet {
resp ->
var app = resp.content?.toJson(javaClass<AppInfo>())
callback(app)
}
}
非同步請求應用資訊,並轉換為AppInfo物件
網路請求封裝了AsyncHttpClient/async-http-client · GitHub, Json轉換封裝了 alibaba/fastjson · GitHub (為了簡約起見,忽略了其他邏輯,下同)
2, 為 Activity 和 Fragment 增加了非同步操作擴充套件
class MainActivity : Activity() {
fun asyncSample() {
async({
// 這裡的程式碼執行在 *執行緒池* 中
// 返回值自動傳入下一個引數
verySlowMethod()
}) {
// 讀取上一個引數的值
// 並且在 *主執行緒* toast出來
str->
str.toast(this)
}
}
}
fun verySlowMethod(): String {
Thread.sleep(2000)
return "kotlin"
}
// async 函式定義
fun async<T>(background: ()-> T, foreground:(T) -> Unit) {
checkPool()
pool?.submit() {
val t:T = background()
runOnUIThread {
foreground(t)
}
}
}
// 為Activity增加擴充套件
inline fun Context.async<T>(noinline b:() -> T, @noinline f:(T) -> Unit) = ThreadExt.async(b, f)
{% endhighlight %}
也可以這樣
{% highlight kotlin %}
fun requestApps() {
showProgressBar()
AppApi.getHotApps {
hotApps ->
ui {
// 該塊內的程式碼將執行在主執行緒
hideProgressBar()
if (hotApps.size() == 0) {
// no data, retry
showRetryButton {
v ->
requestApps()
}
} else {
adapter?.apps = hotApps
}
}
}
}
程式碼解釋,功能是請求應用列表,請求時顯示進度條,失敗顯示重試按鈕,點選重試按鈕,重新請求資料,如此反覆,請求到資料到,將資料交給RecyclerView adapter, 並填充。
其中 getHotApps為非同步函式,其引數為網路請求完畢後的callback。
ui為Fragment或者Activity的擴充套件方法,其塊內的程式碼執行在主執行緒。
(Kotlin的語法糖,如果最後一個引數為Lambda表示式,那麼可以不寫在引數列表中, 如果Lambda表示式沒有引數,可以不寫 -> )
3,對屬性的支援,類似C#,麻麻再也不擔心我寫get set函式啦。
inner class AppAdapter : RecyclerView.Adapter<AppViewHolder>() {
var apps: ArrayList<AppInfo>? = null
set (value) {
$apps = value
notifyDataSetChanged()
}
// 省略其他程式碼
}
這裡使用了set塊,表示,如果該屬性在被賦值時,會呼叫Adapter的notifyXX 方法來通知檢視更新。
先介紹到這裡,開發Android,寫Java到很痛苦的小夥伴們,一起試試吧!
另外,Kotlin現在已經相對穩定,AndroidStudio (IntellJ Idea) 對Kotlin的支援相當好,畢竟是自家的東西。
有了val, 在也不用糾結 static final 和 final static 了。 :-)