1. 程式人生 > >Kotlin系列之Lambda表示式(1)

Kotlin系列之Lambda表示式(1)

今天開始後續的幾篇Kotlin的文章會介紹Kotlin中Lambda表示式相關的內容。

什麼是Lambda表示式

在Java8中引入了Lambda表示式,這是最令Java開發者激動和期待的一個功能。那究竟什麼是Lambda表示式呢?

Lambda表示式本質上是可以傳遞給其他函式的一小段程式碼,我們在之前的Java或者Kotlin中,一個函式的引數可以是一種簡單的基本資料型別變數或一個物件例項變數。Lambda表示式的出現可以讓我們可以把一段程式碼當做一個值來進行對待,由於是值,便可以進行傳遞,所以Lambda可以被當做引數傳遞給其他函式。Lambda表示式的出現,讓我們的程式碼更加簡潔。

Kotlin中的Lambda表示式

上面的文字描述可能比較抽象,我們舉一個實際的例子。我們定義一個數據類人(對於Kotlin資料類不瞭解的可以檢視這篇文章Kotlin系列之資料類和類委託)。我們的目的是找出一堆人中年齡最大的那個人。

我們先用最基礎的Kotlin知識來解決上述問題。程式碼示例如下:

data class People(val name: String, val age: Int)

fun findTheOldest(peopleList: List<People>) {
    var maxAge = 0
    var theOldestPeople: People? = null
for (people in peopleList) { if (people.age > maxAge) { maxAge = people.age theOldestPeople = people } } println(theOldestPeople) } fun main(args: Array<String>) { val peopleList = listOf<People>(People("小白", 22), People("小紅"
, 23), People("琦琦", 20)) findTheOldest(peopleList) }

但是Kotlin中可以使用庫函式配合Lambda將程式碼進行大大的簡化,我們先看看可以最終可以簡化到何種程度。程式碼如下:

fun main(args: Array<String>) {
    val peopleList = listOf<People>(People("小白", 22),
            People("小紅", 23), People("琦琦", 20))
    //關鍵程式碼就這一行
    println(peopleList.maxBy { it.age })
}

是不是被驚豔到了,程式碼量大大大大減少了,而且程式碼所表達的功能也更加清楚了。下面我們就來看看上面的那麼多程式碼是怎麼利用Lambda表示式變成一行程式碼的。

Lambda表示式的簡化過程

下面就來看看具體的演變過程。
首先maxBy這個函式式類似於一個比較器,它不關心具體的集合中的元素是什麼型別,只需要我們傳入比較的規則即可,我們上面比較的規則是人們的年齡。所以我們可以把比較規則使用Lambda來書寫傳入maxBy函式中。

首先先讓我們看看Lambda表示式的語法。一個Lambda表示式的基本結構是這樣:

{引數1: 型別, 引數2: 型別, [...] -> 函式體}

可以看出,一個Lambda表示式被一個花括號包圍,引數並沒有是喲圓括號括起來,引數列表和函式體之間使用箭頭進行分隔。

所以我們依據上面的格式要求,會寫出下面這樣的程式碼:

peopleList.maxBy({p: People -> p.age})

上面是最原始的Lambda表示式程式碼。

根據Kotlin的語法約定: 如果Lambda表示式是函式呼叫的最後一個實參,它可以放在括號的外面。
由於在這個例子中Lambda表示式是maxBy函式的唯一實參,也自然是最後一個實參,所以程式碼就變成下面這樣。

peopleList.maxBy(){p: People -> p.age}

但是要記住,當函式有多個實參時,我們既可以將Lambda表示式留在括號內,也可以放在括號的外面,但當我們傳遞的是兩個或更多個Lambda表示式時,不能把超過一個的Lambda表示式放在括號外面。

根據Kotlin的語法約定: 如果Lambda表示式是函式的唯一實參,可以去掉空的圓括號對。
所以上面的程式碼又會進一步變為下面這樣。

peopleList.maxBy{p: People -> p.age}

根據Kotlin的語法約定: 如果Lambda表示式中引數的型別可以被推匯出來,那麼型別宣告可以被省略。
這個例子中編譯器知道maxBy要處理的每一個元素都是People型別,所以這裡不需要顯式指定型別。
所以程式碼被進一步簡化為下面這樣。

peopleList.maxBy{p -> p.age}

當然我們前面也說了,Lambda就是一段程式碼,我們可以使用變數儲存它,便於多次使用。當我們使用變數儲存Lambda表示式時,由於缺少上下文環境,所以無法進行引數型別推斷,所以必須顯式指定引數型別。

根據Kotlin的語法約定: 如果Lambda表示式中只有一個引數,並且這個引數的型別可以被推斷出來,那麼可以使用預設引數名稱it來代替命名引數。
所以最終程式碼變成了這樣。

peopleList.maxBy{it.age}

it雖然可縮短程式碼,但是卻不可以濫用,在Lambda表示式巢狀的情況下,it沒法清楚表示到底引用的是哪個值,會造成程式碼的混亂,所以在這種情況下建議顯式指定引數名稱。

最後再補充一個小點,Lambda表示式並沒有限定是單個表示式,他截圖包含更多的語句,當包含更多的語句時,最後一個表示式就是Lambda表示式的結果,就像下面這樣:

fun main(args: Array<String>) {
    val sum = {x: Int, y: Int ->
        println("start to calc...")
        x + y
    }
    println(sum(1, 2))
}

寫在最後

通過上面的介紹,是不是已經被Kotlin中的Lambda表示式吸引了呢,後續還有幾篇文章將介紹Kotlin中Lambda表示式的更多內容。

相關推薦

Kotlin系列Lambda表示式(1)

今天開始後續的幾篇Kotlin的文章會介紹Kotlin中Lambda表示式相關的內容。 什麼是Lambda表示式 在Java8中引入了Lambda表示式,這是最令Java開發者激動和期待的一個功能。那究竟什麼是Lambda表示式呢? Lambd

Kotlin系列Lambda表示式完全解析

簡述: 今天帶來的Kotlin淺談系列的第六彈, 一起來聊下Kotlin中的lambda表示式。lambda表示式應該都不陌生,在Java8中引入的一個很重要的特性,將開發者從原來繁瑣的語法中解放出來,可是很遺憾的是隻有Java8版本才能使用。而Kotlin則彌

Kotlin系列Lambda表示式(2)

上一篇文章講到了最基本的Lambda表示式,今天這篇文章繼續講Lambda表示式中的在作用域中訪問變數。 Java中的內部類訪問變數 當我們在函式內部使用匿名內部類時,我們可以在匿名內部類內使用函式的引數和函式內的區域性變數。當我們在使用Lamb

Kotlin系列Lambda表示式(3)

今天一起來看看Kotlin中與Lambda相關的成員引用的內容。 定義 先說說什麼是成員引用,這裡的引用指的就是變數引用,就相當於Java中的引用概念。成員的概念這裡包含了成員變數和成員方法。這都是很官方的的說法。說白了,就是類裡面的變數和函式。

JDK 1.8 新特性Lambda表示式

Lambda表示式基礎 Lambda表示式【Lambda Expressions】也可稱為閉包,是推動 Java 8 釋出的最重要新特性。Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),使用 Lambda 表示式可以使程式碼變的更加

[Java]“語法糖”系列(二)Lambda表示式/匿名函式(Lambda Expression)

>什麼是Lambda表示式     簡短的說,Lambda表示式是一種用於取代匿名類,把函式行為表述為函數語言程式設計風格的一種匿名函式。     匿名類大家自然熟悉,上面那句話提到了“函式行為”,那麼什麼是函式行為? >函式行為     假設有這樣一個應用場

docker系列基礎命令-1

列表 http port ML 配置 狀態 如何 art commit 1.docker基礎命令 docker images 顯示鏡像列表 docker ps 顯示容器列表 docker run IMAGE_ID 指定鏡像, 運行一個容器 docker start/stop

Kotlin開發三 kotlin中的lambda表示式

1 Lambda表示式定義 kotlin中lambda表示式定義如下: {param1:Type,param2:Type… -> ….} 例子 {x:Int,y:String -> y.length + x} 就是一個lambda表示式 在kotl

Python3lambda表示式和三元運算子

lambda表示式 lambda表示式,通常是在需要一個函式,但是又不想費神去命名一個函式的場合下使用,也就是指匿名函式。 lambda是一個表示式而不是一個語句,lambda用來編寫簡單的函式,不會再重複利用的函式。而def用來處理強大的任務。 lambda就是用來定義一個匿名函式的,如果

java8學習:lambda表示式(1)

內容來自《 java8實戰 》,本篇文章內容均為非盈利,旨為方便自己查詢、總結備份、開源分享。如有侵權請告知,馬上刪除。書籍購買地址:[java8實戰] 上一篇內容解釋了行為引數化的概念並用例項演示瞭如何是行為引數化,文末提到了lambda表示式,那麼本文將講解lambda表示式

基礎 | Java8新特性Lambda表示式

Lambda表示式是Java8所引入的新特性之一,其基於函式式介面,以極大地減少程式碼冗餘,並提高程式碼的可讀性。 Lambda表示式的基本語法 參考答案: Java8中引入箭頭操作符(也叫Lambda操作符)將Lambda表示式拆分成左右兩部分: 左

Java8新特性Lambda表示式學習二

大家好,又來到超超部落格大本營啦!歡迎大家...... 上一章我們講解了Lambda表示式的基礎語法,引數列表、變數等知識點,接下來我們接續探究Lambda的表示式、以及其中的方法引用。 一、Lambda的表示式: (1)如果表示式只有一行,那麼可以直接寫(不需要{}); (2)

Java8新特性Lambda表示式學習一

       剛畢業入職新工作,在職崗位培訓時,老師在操作集合老使用Lambda表示式。這使一個之前完全沒有接觸過Lambda表示式的少年甚是苦惱,看不懂,閒餘時間決定搞一搞Lambda表示式到底是啥東西?底層原理怎麼實現的,接下來我將我的學習成果一起分享

用go編寫區塊鏈系列4--交易1

0 介紹 比特幣區塊鏈的核心就是交易,區塊鏈唯一的目的就是用一種安全可信的方式去儲存交易,交易一經建立就無法更改。這章中我們將在區塊鏈中引入交易。 1 比特幣中的交易 如果你是開發網路應用的程式設計師,若讓你開發一個線上支付交易,你多半會在資料庫中建立倆張表:賬戶表和交易表。賬戶表中將會

(譯)Effective Kotlin系列遇到多個構造器引數要考慮使用Builder(二)

翻譯說明: 原標題: Effective Java in Kotlin, item 2: Consider a builder when faced with many constructor parameters 原文地址: https://blog.kotlin-academy.

(譯)Effective Kotlin系列考慮使用靜態工廠方法替代構造器(一)

翻譯說明: 原標題: Effective Java in Kotlin, item 1: Consider static factory methods instead of constructors 原文地址: https://blog.kotlin-academy.com/eff

初識Lambda表示式1----java

寫在前面的話     終於還是換了新的工作,比起原來每天早上8:00上班晚上12點多才回宿舍的日子,現在真的幸福的不止一點半點。但真正讓我最開心的是公司裡有很多的大牛,也用了很多的新技術,而現在我也有相對比較充足的時間去給自己充電,希望自己能夠通過不懈的努力更快的成為

python基礎lambda表示式

一. 在排序中的應用 例: >>> List=[{"name":"wan gang","age":22,"gender":"boy","score":583}, {"name":"zhang mei","age":21,"gender":"girl","score":53

Java8新特性lambda表示式

     在瞭解lambda表示式之前,必須先了解函數語言程式設計、函式式介面和default方法。在Java8出來之前,別的程式語言中已經有了函數語言程式設計這種概念,只不過後來沒落了,不過在最近幾年又火起來了。在Java8中大力提倡我們使用函數語言程式設計,並且更新了一些

(譯)Effective Kotlin系列探索高階函式中inline修飾符(三)

簡述: 不知道是否有小夥伴還記得我們之前的Effective Kotlin翻譯系列,之前一直忙於趕時髦研究Kotlin 1.3中的新特性。把此係列耽擱了,趕完時髦了還是得踏實探究本質和基礎,從今天開始我們將繼續探索Effective Kotlin系列,今天是Effective Kotlin第三講。 翻譯說明