Lambda表達式在Kotlin中怎樣工作的:setOnClickListener的轉換(KAD 18)

来源:http://www.cnblogs.com/figozhg/archive/2017/04/02/6659075.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Mar 28, 2017 原文鏈接:https://antonioleiva.com/lambdas-kotlin-android/ 雖然,我在其它文章講過一點Lambda表達式,我願意更深層次解釋Kotlin中Lambda表達式是怎樣工作的,以及當我們用Ja ...


作者:Antonio Leiva

時間:Mar 28, 2017

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

 

 

雖然,我在其它文章講過一點Lambda表達式,我願意更深層次解釋KotlinLambda表達式是怎樣工作的,以及當我們用Java庫時,他們是怎樣以Lambda表達式的單一方法轉換介面。

 

特別是我要給出一些例子解釋怎樣簡化Android框架的用法,我們還將詳細看到Android視圖的setOnClickListener

 

SetOnClickListener轉換

 

我最喜歡Kotlin特性之一就是由於有了一些約定它簡化Android框架的工作

 

 

例如,setOnClickListener函數,在Java中時這樣定義的:

1 public void setOnClickListener(OnClickListener l) {
2    ...
3 }

 

而在Kotlin中我們使用它時,可以這樣:

1 fun setOnClickListener(l: (View) -> Unit)

 

這節省我們必須創建介面的一個匿名實現,極大地簡化了UI組件的初始化工作。

 

SetOnclickListener原本方法

 

 

依照上面,我們已經節省了足夠的代碼了,就是我們原必須創建OnClickListener的匿名類:

1 view.setOnClickListener(object : View.OnClickListener {
2     override fun onClick(v: View?) {
3         toast("Hello")
4     }
5 })

 

不過你將看到編輯器直接給你的警告,建議你用Lambda方法。

 

你能夠做的轉換:

 

1 view.setOnClickListener({ v -> toast("Hello") })

 

 

簡單,對吧?但是,這還能更進一步簡化。

 

 

如果函數的最後一個參數是函數,它能夠移到圓括弧外面。

 

 

因此,我們能夠按此提取偵聽器:

 

1 view.setOnClickListener() { v -> toast("Hello") }

 

 

如果我們有多個參數,其餘的參數則在圓括弧內,即使這些參數是函數。僅僅最後一個參數能夠提出來。

 

 

如果函數僅有一個參數,且它是一個函數,則圓括弧能刪除

 

 

而不是留著空的圓括弧,我們最好刪除這空的圓括弧:

 

1 view.setOnClickListener { v -> toast("Hello") }

 

 

這就構成了代碼塊。在這種方法下,我們能夠定義我們自己的模型語言DSL

 

一個非常典型的例子是Kotlin參考頁面,他們構件DSL通過代碼創建HTML

 

如果你不用Lambda參數,你可以刪除函數的左邊部分

 

如果你僅有一個參數這是正確。不使用視圖(v),就可以刪除它:

1 view.setOnClickListener { toast("Hello") }

 

另外,在函數僅接收參數,則不是在左邊定義,而是用保留字it,節省一些字元。

 

例如,如果我們用視圖傳遞它到另一個方法:

 

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

 

 

我們可以選擇簡單的用it

1 view.setOnClickListener { doSomething(it) }

 

Lambda表達式,你的朋友

 

你見到的這些代碼的不同之處是非常重要的。這不僅為你節省了字元(約70%),還極大地提高了代碼的可讀性

 

 

我們只編寫真正重要的代碼,而跳過那些並沒有多大用處的代碼。

 

 

如果你想進一步學習更多這些知識,能夠非常流利創建自己的Android應用程式,我建議你獲取這本免費指南,學習怎樣構建你的第一個項目,或直接購買這本書,學習怎樣從頭開始創建一個完整的應用程式。

 

 

 

 

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 參考: "深入理解Android之AOP" AOP雖然是方法論,但就好像OOP中的Java一樣,一些先行者也開發了一套語言來支持AOP。目前用得比較火的就是AspectJ了,它是一種幾乎和Java完全一樣的語言,而且完全相容Java(AspectJ應該就是一種擴展Java,但它不是像Groovy " ...
  • 關於講解UITabel View的使用 參照 鏈接 http://www.bubuko.com/infodetail-974265.html identifier 可以看到在創建cell的時候伴隨著一個identifier的綁定,這個identifier可以理解為這個cell標識,標識它屬於哪個重用 ...
  • 轉載請註明出處:http://www.cnblogs.com/cnwutianhao/p/6664293.html 應該是目前為止全網最詳細的GCM推送解析。 GCM官方解釋: https://developers.google.cn/cloud-messaging/?hl=zh-cn Send d ...
  • 通過更換代理解決 Android SDK 線上更新鏡像伺服器資源:大連東軟信息學院鏡像伺服器地址:http://mirrors.neusoft.edu.cn 埠:80北京化工大學鏡像伺服器地址:IPv4: http://ubuntu.buct.edu.cn/ 埠:80IPv4: http://u ...
  • 1.精簡代碼, 返回最後一句的值,這個方法有一個優點,所有的變數都在代碼塊中,也就是只在代碼塊的區域中有效,這意味著可以減少對其他作用域的命名污染。但缺點是可讀性比較差 NSURL *url = ({ NSString *urlString = [NSString stringWithFormat: ...
  • 身為一個iOS程式員,雖然iOS相關技術十分重要,但是bash也是不可不瞭解的,因為技能的成長,除了深度,還需要廣度。下麵就來介紹下bash。 Shell是C語言編寫的,所以他是解釋性語言,運行在Linux系統下,在Mac下,一般使用的是bashell。 bashell都是運行在Terminal下, ...
  • Android 編程時我們少不了使用FindIdByView函數,在Xamarin Android開發時也需要如此。這個工作很無聊且煩人。在常規Android開發中,人們已經發明瞭一些方法免除這項工作,例如Android數據綁定,還有butterknife,都可以解決這個問題。關於它們我不去細說了。 ...
  • 總是用模擬器,小破本的渣記憶體無法承受,同時模擬器的版本大多停在4.4,無法體現Android 5.0、6.0 的版本特性,因此決定利用 Android Studio 的插件實現真機無線調試。 步驟如下: 1. 手機開啟 USB 調試模式 :把手機通過 USB 數據線連接到電腦,開啟 USB調試,步驟 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...