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

作者: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

轉載于:https://www.cnblogs.com/figozhg/p/6257656.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394211.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pyhon進階9---類的繼承

類的繼承 基本概念 定義 格式如下 繼承中的訪問控制 class Animal:__CNOUT 0HEIGHT 0def __init__(self,age,weight,height):self.__CNOUT self.__CNOUT 1self.age ageself.__weight weightself.HEIGHT heightdef eat(self):print({} eat.format(self.__class__.__name__…

python怎么備份列表_python實例:backup 備份

python實例:backup 備份本文來源于《python簡明教程》中的實例1. 提出問題: 我想要一個可以為我的所有重要文件創建備份的程序。2. 分析明確問題:我們如何確定該備份哪些文件?備份保存在哪里?我們怎么樣存儲備份&#…

leetcode1466. 重新規劃路線(dfs)

n 座城市,從 0 到 n-1 編號,其間共有 n-1 條路線。因此,要想在兩座不同城市之間旅行只有唯一一條路線可供選擇(路線網形成一顆樹)。去年,交通運輸部決定重新規劃路線,以改變交通擁堵的狀況。 路…

mysql數學函數名_Mysql數學函數

所有的數學函數在發生錯誤的情況下,均返回 NULL。-一元減。改變參數的符號:mysql> SELECT - 2;-> -2注意,如果這個操作符被用于一個 BIGINT,返回值也是一個 BIGINT!這就意味著,應該避免在一個可能有值…

angular 漸進_如何創建具有Angular和無頭CMS的漸進式Web應用程序

angular 漸進by Ondrej Chrastina通過Ondrej Chrastina 如何創建具有Angular和無頭CMS的漸進式Web應用程序 (How to create a progressive web app featuring Angular and headless CMS) Have you ever wondered how a headless Content Management System fits in with Progr…

win10不用第三方工具激活的方法

步驟:1、本機上裝個win7旗艦版,這個得拿第三方工具激活一下,當然你如果已經購買了正版更沒問題了。第三方工具推薦那個啥啥loader,記住:chew_wga系列的暴力工具是不行的哦;2、把需要安裝的win10官方安裝鏡像…

CentOS 7 搭建 LAMP

一、安裝httpd 1、yum install httpd -y 2、啟動服務:systemctl start httpd 3、設置開機啟動:systemctl enable 二、安裝mariadb 1、yum groupinstall mariadb 2、啟動服務:systemctl start mariadb 3、設置開機啟動:systemctl e…

quartz教程二

轉載于:https://www.cnblogs.com/mumian2/p/10729901.html

python hookapi_pytest文檔70-Hook鉤子函數完整API總結?

pytest_collectstart(collector: Collector) 收集器開始收集。pytest_make_collect_report(collector: Collector) 執行collector.collect()并返回一個CollectReport。pytest_itemcollected(item: Item) 我們剛剛收集了一個測試項目。pytest_collectreport(report: Coll…

出現字跡模糊跡象_改變跡象:如何使用動態編程解決競爭性編程問題

出現字跡模糊跡象by Sachin Malhotra由Sachin Malhotra 改變跡象:如何使用動態編程解決競爭性編程問題 (Change the signs: how to use dynamic programming to solve a competitive programming question) If you’re a competitive programmer like I am, one of…

leetcode695. 島嶼的最大面積(dfs)

給定一個包含了一些 0 和 1 的非空二維數組 grid 。一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這里的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍著。找到給定的二維數組中最大…

python把圖片轉為字符畫_Python 實現圖片轉換為字符畫

主要使用 pillow如果沒有安裝 使用 pillow install pillow 安裝一下看代碼&#xff1a;from PIL import Imageimport argparse#字符畫所用的字符集ascii_char list("$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^. ")def get…

冒泡的三種寫法

學而時習之&#xff0c;不亦說乎&#xff01; --《論語》 package com.zby.bubble;import java.util.Arrays; /*** * <class description>簡單初級冒泡算法java實現* author zby**/ public class PrimaryBubble {public static void main(String[] args) {int[] arr { 1…

76. Minimum Window Substring

最后更新 一刷 08-Jan-2017 昨天Amazon group面結束&#xff0c;剛回家。 國內以前喜歡的女生結婚了&#xff0c;嘿嘿...好開心呀~~ 這次面試感覺自己的做法完爆別人&#xff0c;比什么2 greedy好多了 總之表現比想象的好&#xff0c;最后一面的面試官真是聰明得一逼&#xff…

day 02 python 基礎

1.day1作業講解 題目答案見day1 2.格式化輸出 %占位符&#xff0c;s:字符串&#xff0c;d&#xff1a;數字 %%只是單純的顯示%&#xff08;顯示的%是后面的&#xff09; 1 #格式化輸出2 # % s d3 # name input(請輸入姓名)4 # age input(請輸入年齡)5 # height input(請輸入…

python多維數據劃分_【python+機器學習(4)】多維數據的特征選取(RidgeLasso)...

歡迎關注哈希大數據微信公眾號【哈希大數據】在之前我們介紹了直接使用線性回歸進行波士頓房價的預測&#xff0c;但是預測準確率僅有60%左右。預測準確率不高一方面是我們未對數據進行一定的預處理(包括歸一化和標準化等)&#xff0c;這樣不能確保在使用優化方式時&#xff0c…

leetcode64. 最小路徑和(dp)

給定一個包含非負整數的 m x n 網格&#xff0c;請找出一條從左上角到右下角的路徑&#xff0c;使得路徑上的數字總和為最小。說明&#xff1a;每次只能向下或者向右移動一步。示例:輸入: [[1,3,1],[1,5,1],[4,2,1] ] 輸出: 7 解釋: 因為路徑 1→3→1→1→1 的總和最小。代碼 …

mysql淺拷貝_深拷貝與淺拷貝

在Python中&#xff0c;對象賦值實際上是對象的引用。當創建一個對象&#xff0c;然后把它賦給另一個變量的時候&#xff0c;Python并沒有拷貝這個對象&#xff0c;而只是拷貝了這個對象的引用。1、淺拷貝&#xff1a;利用切片操作、工廠方法list方法拷貝2、深拷貝&#xff1a;…

盤州市“檢企聯合” 探索大數據應用新路

為認真貫徹落實“科技強檢”及推進大數據應用的決策部署&#xff0c;8月31日&#xff0c;盤州市人民檢察院組織召開以“檢察大數據”為主題的“兩長”座談會。市經信局、中國移動盤州分公司、中國電信盤州分公司等單位負責人&#xff0c;檢察院在家班子成員及院各部門主要負責人…

iOS中的顏色

最近在改Bug的時候&#xff0c;才注意到iOS 中的顏色竟然也大有文章&#xff0c;特來記錄一下。 先說一下問題&#xff0c;因為某界面中有用xib實現的一個view&#xff0c;而這個view 只在UIColletionView的layout 里通過nib 注冊使用&#xff0c;為這個xib設置了背景色&#x…