Kotlin的Lambda表達式以及它們怎樣簡化Android開發(KAD 07)

来源:http://www.cnblogs.com/figozhg/archive/2017/01/06/6257656.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Jan 5, 2017 原文鏈接:https://antonioleiva.com/lambdas-kotlin/ 由於Lambda表達式允許更簡單的方式建模式函數,所以它是Kotlin和任何其他現代開發語言的最強工具之一。 在Java6中,我們僅能下麵方法這 ...


作者:Antonio Leiva

時間:Jan 5, 2017

原文鏈接:https://antonioleiva.com/lambdas-kotlin/

 

 

由於Lambda表達式允許更簡單的方式建模式函數,所以它是Kotlin和任何其他現代開發語言的最強工具之一。

 

在Java6中,我們僅能下麵方法這樣做:通過用單一方法聲明介面,並用匿名對象實現那些介面。

 

Lambda表達式特別是在Kotlin中能定義的方式,為我們開啟無線可能的世界。在接下來的內容中,我們將瞭解這些用法。

 

Kotlin的Lambda表達式

 

Lambda表達式是函數的表示的方式,在解釋setOnClickListener時,我們已經見過這個例子:

1 val view = findViewById(R.id.welcomeMessage)
2 view.setOnClickListener { v -> navigateWithView(v) }

 

如你所見,左邊定義函數(在這個例子中時view)的輸入值,右邊聲明函數要實現的操作。

 

怎樣定義接受Lambda表達式的函數

 

如果我們自己要在Kotlin中定義函數,我們就需要按如下做法:

1 fun setOnClickListener(listener: (view: View) -> Unit){}

 

由於這個函數通過參數接收一函數,或返回一函數,所以,這是一高階函數

 

Kotlin和Java interop

 

調用這個函數的一般方式可能是如下:

1 view.setOnClickListener({ v -> navigateWithView(v) })

 

這是我們已經見到這樣做的比較簡單的方法,而後續我們還能知道它幫助我們做更酷的事。

 

 

這是由於如果函數的最後一個參數是函數,我們能夠將它從括弧中提取出來:

1 view.setOnClickListener(){ v -> navigateWithView(v) }

 

另外,如果只有一個函數作為參數,我們還能省去括弧:

1 view.setOnClickListener { v -> navigateWithView(v) }

 

DSL創建

 

這允許我們創建自己的DSL,這能定義微型語言。在Kotlin參考網站有HTML例子,而這裡我們要定義一個更簡介方法。

 

 

假設你要創建在另一個線程上運行的代碼塊。你可以有一個函數,它接收在後臺運行的一個函數:

1 fun doAsync(f: () -> Unit) {
2     Thread({ f() }).start()
3 }

 

這個函數產生一個線程,它執行Runnable運行作為自變數接受的函數。RunnableJava中有單一方法的類,在Kotlin中由Lambda表達式替代。

 

 

現在,在我們的代碼中,產生非同步代碼塊:

1 doAsync { 
2     op1()
3     op2()
4     op3()
5 }

 

這樣在{}內的每件事都將在第二個線程中執行。

 

 

內嵌函數

 

作為自變數接收的函數令人討厭的是編譯器需要為它們創建類,這將影響性能。但是,這可以用保留字inline容易地解決。

 

 

由於Inline函數是在編譯時將它的代碼替換對它的調用,所以在性能方面影響較少。為此,它不需要用額為的對象。

 

 

我們能夠轉換doAsync到一個inline函數:

1 inline fun doAsync(crossinline f: () -> Unit) {
2     Thread({ f() }).start()
3 }

 

在這個例子中,由於我們從另一個執行內容(另一個Lambda表達式)中調用f(),所以要求crossinline。不用太擔心這些,在需要使用它時,編譯器會提醒你的。

 

 

結論

 

如你所見,使用Lambda表達式後,我們能夠簡化很多我們的代碼,甚至是在Java中不能實現的事。

 

 

另外,Kotlin的特別命名規則使我們能夠創建屬於我們自己的“開發語言”,並且還可以根據需要創建有意義的代碼塊。

 

 

Lambda表達式功能非常強大,這本書包含許多你能使用它們不同的情況

 

KotlinJava interop


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 函數本身就是一段JavaScript代碼,定義一次但可能被調用任意次。如果函數掛載在一個對象上,作為對象的一個屬性,通常這種函數被稱作對象的方法。用於初始化一個新創建的對象的函數被稱作構造函數。 相對於其他面向對象語言,在JavaScript中的函數是特殊的,函數即是對象。JavaScript可以把 ...
  • 該文為閱讀高級程式設計(第三本)p144-p164的理解與總結! 接受指導與批評。 對於我,我一直是使用字面量的方式創建對象,然而體繫上的創建對象的方法卻並不局限於此。 創建對象的方法 1 工廠模式: 定義工廠函數創建並返回包含特定屬性的對象, 2 構造函數模式: 先貼出代碼 2.1 new Per ...
  • 本系列將從以下三個方面對Tinker進行源碼解析: 轉載請標明本文來源:http://www.cnblogs.com/yyangblog/p/6252855.html更多內容歡迎star作者的github:https://github.com/LaurenceYang/article如果發現本文有什 ...
  • 地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E6467914871AB8802 https://dl-ssl.google.com/android/re ...
  • service—Android的四大組件之一。人稱“後臺服務”指其本身的運行並不依賴於用戶可視的UI界面 實際開發中我們經常需要service和activity之間可以相互傳遞數據維持程式的運行。 先瞭解Service的生命周期吧。 新建一個類繼Service: 新建以上類並繼承Service後只會 ...
  • Android Butterknife 8.4.0 使用方法總結 ...
  • Android SDK版本號 與 API Level 對應關係如下表: Code nameVersionAPI level (no code name) 1.0 API level 1 (no code name) 1.1 API level 2 2008 年9月發佈的Android第一版 Cupc ...
  • APP簡介 律師查詢是基於聚合數據的律師查詢介面做的,這個介面目前處於停用狀態,但是,由於我是之前申請的,所以,還可以用,應該是無法再申請了。 效果圖 開發 一、HttpHelper 既然是請求介面的,那就少不了請求方式,這裡是比較常用的HttpClient,用起來也比較方便,單獨封裝一個HttpH ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...