第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Lambda 表達(dá)式簡(jiǎn)介

大家好,今天我們開(kāi)始一個(gè)新專題 —— Java Lambda 表達(dá)式。這是在 Java 8 中出現(xiàn)的一個(gè)新特性,但它并不是 Java 獨(dú)有的,JavaScript、C#、C++ 等在 Java 8 之前就支持 Lambda 表達(dá)式的特性,現(xiàn)在的大多數(shù)程序語(yǔ)言也都支持 Lambda 表達(dá)式。
這個(gè)專題中我們學(xué)習(xí)函數(shù)式編程的概念、Lambda 表達(dá)式的語(yǔ)法、以及如何在我們的代碼中使用 Lambda 表達(dá)式。本文我們主要先介紹下 Lambda 表達(dá)式是什么?

1. 什么是 Lambda 表達(dá)式

什么是 Lambda 表達(dá)式呢?維基百科是這樣定義的:

Lambda expression in computer programming, also called an anonymous function, is a defined function not bound to an identifier. ——維基百科

翻譯過(guò)來(lái)就是 Lambda 表達(dá)式也叫作匿名函數(shù),是一種是未綁定標(biāo)識(shí)符的函數(shù)定義,在編程語(yǔ)言中,匿名函數(shù)通常被稱為 Lambda 抽象。

換句話說(shuō), Lambda 表達(dá)式通常是在需要一個(gè)函數(shù),但是又不想費(fèi)神去命名一個(gè)函數(shù)的場(chǎng)合下使用。這種匿名函數(shù),在 JDK 8 之前是通過(guò) Java 的匿名內(nèi)部類來(lái)實(shí)現(xiàn),從 Java 8 開(kāi)始則引入了 Lambda 表達(dá)式——一種緊湊的、傳遞行為的方式。

2. 為什么要引入 Lambda 表達(dá)式

Java Lambda 表達(dá)式是伴隨 Java 8 于 2014 年出現(xiàn)的。這個(gè)時(shí)候恰好是多核 CPU 和大數(shù)據(jù)興起的時(shí)候。在這些趨勢(shì)下,芯片設(shè)計(jì)者只能采用多核并行的設(shè)計(jì)思路,而軟件開(kāi)發(fā)者必須能夠更好地利用底層硬件的并發(fā)特性。做過(guò)多線程編程的同學(xué)應(yīng)該很清楚,在并發(fā)過(guò)程中涉及鎖相關(guān)的編程算法不但容易出錯(cuò),而且耗時(shí)費(fèi)力。雖然 Java 提供了 java.util.concurrent 包以及很多第三方類庫(kù)來(lái)幫助我們寫(xiě)出多核 CPU 上運(yùn)行良好的程序,但在大數(shù)據(jù)集合的處理上面這些工具包在高效的并行操作上都有些欠缺,我們很難通過(guò)簡(jiǎn)單的修改就能夠在多核 CPU 上進(jìn)行高效的運(yùn)行。

為了解決上述的問(wèn)題,需要在程序語(yǔ)言上修改現(xiàn)有的 Java ——增加 Lambda 表達(dá)式,同時(shí)在 Java 8 也引入Stream(java.util.stream) 流——一個(gè)來(lái)自數(shù)據(jù)源的元素隊(duì)列,支持聚合操作,來(lái)提供對(duì)大數(shù)據(jù)集合的處理能力。

所以 Lambda 表達(dá)式的出現(xiàn)時(shí)為了適應(yīng)多核 CPU 的大趨勢(shì),一方面通過(guò)它我們方便的高效的并發(fā)程序,通過(guò)簡(jiǎn)單地修改就能編寫(xiě)復(fù)雜的集合處理算法。

3. Lambda 表達(dá)式的優(yōu)點(diǎn)

那么 Lambda 具體有哪些優(yōu)點(diǎn)呢?

  1. 更加緊湊的代碼: Lambda 表達(dá)式可以通過(guò)省去冗余代碼來(lái)減少我們的代碼量,增加我們代碼的可讀性;
  2. 更好地支持多核處理: Java 8 中通過(guò) Lambda 表達(dá)式可以很方便地并行操作大集合,充分發(fā)揮多核 CPU 的潛能,并行處理函數(shù)如 filter、map 和 reduce;
  3. 改善我們的集合操作: Java 8 引入 Stream API,可以將大數(shù)據(jù)處理常用的 map、reduce、filter 這樣的基本函數(shù)式編程的概念與 Java 集合結(jié)合起來(lái)。方便我們進(jìn)行大數(shù)據(jù)處理。

4. 我們的第一個(gè)例子

前面說(shuō)了 Lambda 表達(dá)式的優(yōu)點(diǎn),我們用一個(gè)例子來(lái)直觀的感受下 Lambda 表達(dá)式是如何幫我們減少代碼行數(shù),增加可讀性的。

Swing 是一個(gè)與平臺(tái)無(wú)關(guān)的 Java 類庫(kù)(位于 java.awt.* 中),用來(lái)編寫(xiě)圖形界面( GUI )。里面有一個(gè)常見(jiàn)的用法:為了響應(yīng)用戶操作,需要注冊(cè)一個(gè)事件監(jiān)聽(tīng)器,當(dāng)用戶輸入時(shí),監(jiān)聽(tīng)器就會(huì)執(zhí)行一些操作(這類似于我們網(wǎng)頁(yè)的上的一個(gè) Botton 按鈕,當(dāng)用戶點(diǎn)擊按鈕后,js 代碼會(huì)執(zhí)行相應(yīng)的動(dòng)作)。

4.1 使用使用匿名內(nèi)部類來(lái)將行為和點(diǎn)擊按鈕進(jìn)行關(guān)聯(lián)

這是我們?cè)?Java 8 以前,通常的寫(xiě)法:

button.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        System.out.println("button click");        
    }
});

在上面的例子中,我們創(chuàng)建了一個(gè)對(duì)象來(lái)實(shí)現(xiàn) ActionListener 接口(這個(gè)對(duì)象并沒(méi)有命名,它是一個(gè)匿名內(nèi)部類),這個(gè)對(duì)象有一個(gè) actionPerformed 方法。當(dāng)用戶點(diǎn)擊按鈕 button 時(shí),就會(huì)調(diào)用該方法,輸出 button click

4.2 使用 Lambda 表達(dá)式來(lái)將行為和點(diǎn)擊按鈕進(jìn)行關(guān)聯(lián)

在使用 Lambda 表達(dá)式以后的寫(xiě)法:

button.addActionListener(event -> System.out.println("button click"));

我們只用了一行代碼就完成了,你是不是一眼就看出來(lái)這個(gè)點(diǎn)擊事件做的就是輸出 button click。
關(guān)于 Lambda 表 達(dá)式其他的兩個(gè)特點(diǎn)我們將在后續(xù)的內(nèi)容中進(jìn)行解釋。

5. 前置知識(shí)

本教程主要講解的是 Java 8 新特性中的 Lambda 表達(dá)式的語(yǔ)法基礎(chǔ)以及應(yīng)用,所以需要學(xué)習(xí)本教程的讀者至少掌握 Java 基礎(chǔ)語(yǔ)法,Java 集合,迭代器,還需要了解部分設(shè)計(jì)模式以及設(shè)計(jì)原則為后期部分小節(jié)學(xué)習(xí)做鋪墊。

6. 小結(jié)

本節(jié)主要介紹了:
  • 分析了 Java 8 開(kāi)始支持 Lambda 表達(dá)式的動(dòng)機(jī)、以及使用 Lambda 表達(dá)式的好處。
  • 介紹了 Lambda 表達(dá)式的優(yōu)點(diǎn),并通過(guò) Swing 的按鈕點(diǎn)擊事件來(lái)直觀的感受 Lambda 表達(dá)式是如何來(lái)簡(jiǎn)化我們的代碼的。