日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程

發(fā)布時(shí)間:2023/12/3 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java lambda函數(shù)

Java SE 8新功能瀏覽 ”系列的這篇文章將深入了解Lambda表達(dá)式 。 我將向您展示Lambda表達(dá)式的幾種不同用法。 它們都具有功能接口的共同實(shí)現(xiàn)。 我將解釋編譯器如何從代碼中推斷信息,例如特定類(lèi)型的變量以及后臺(tái)實(shí)際發(fā)生的情況。

在上一篇文章“ Java SE 8新特性之旅:Java開(kāi)發(fā)世界中的重大變化 ”中,我討論了在本系列文章中我們將要探索的內(nèi)容。 我首先介紹了Java SE 8的 主要功能 ,然后介紹了在Microsoft Windows和Apple Mac OS X平臺(tái)上JDK8的安裝過(guò)程 ,并提供了重要的建議和注意事項(xiàng)。

最后,我們開(kāi)發(fā)了一個(gè)由Lambda表達(dá)式支持的控制臺(tái)應(yīng)用程序,以確保可能已經(jīng)安裝了Java SE 8。

源代碼托管在我的Github帳戶上:從此處克隆。

Lambda表達(dá)是什么?

Java SE 8的最著名的新功能也許叫做Project Lambda,它是將Java引入函數(shù)式編程領(lǐng)域的一項(xiàng)努力。

用計(jì)算機(jī)科學(xué)術(shù)語(yǔ);


Lambda是一個(gè)匿名函數(shù)。 即,沒(méi)有名稱(chēng)的功能。

在Java中;


所有函數(shù)都是類(lèi)的成員,被稱(chēng)為方法。 要?jiǎng)?chuàng)建方法,您需要定義其所屬的類(lèi)。

Java SE 8中的lambda表達(dá)式使您可以使用非常簡(jiǎn)潔的語(yǔ)法定義一個(gè)類(lèi)和單個(gè)方法,以實(shí)現(xiàn)具有單個(gè)抽象方法的接口。

讓我們弄清楚這個(gè)想法。

Lambda Expressions使開(kāi)發(fā)人員可以簡(jiǎn)化和縮短其代碼。 使它更具可讀性和可維護(hù)性。 這導(dǎo)致刪除更多詳細(xì)的類(lèi)聲明 。

讓我們看一些代碼片段。

  • 實(shí)現(xiàn)接口:在Java SE 8之前,如果要?jiǎng)?chuàng)建線程,首先要定義一個(gè)實(shí)現(xiàn)可運(yùn)行接口的類(lèi)。 這是一個(gè)具有名為Run的抽象方法的接口,該抽象方法不接受任何參數(shù)。 您可以在其自己的代碼文件中定義該類(lèi)。 由MyRunnable.java命名的文件。 就像我在這里所做的那樣,您可以將類(lèi)命名為MyRunnable。 然后,您將實(shí)現(xiàn)單個(gè)抽象方法。 public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("I am running");}public static void main(String[] args) {MyRunnable r1 = new MyRunnable();new Thread(r1).start();} }

    在此示例中,我的實(shí)現(xiàn)將文字字符串輸出到控制臺(tái)。 然后,您將獲取該對(duì)象,并將其傳遞給線程類(lèi)的實(shí)例。 我將可運(yùn)行對(duì)象實(shí)例化為名為r1的對(duì)象。 將其傳遞給線程的構(gòu)造函數(shù)并調(diào)用線程的start方法。 現(xiàn)在,我的代碼將在自己的線程和內(nèi)存空間中運(yùn)行。

  • 實(shí)現(xiàn)內(nèi)部類(lèi):您可以對(duì)此代碼進(jìn)行一些改進(jìn),而不是將類(lèi)聲明為單獨(dú)的文件,而可以將其聲明為使用該類(lèi)的方法的局部使用類(lèi),即內(nèi)部類(lèi) 。 public static void main(String[] args) {Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("I am running");}};new Thread(r1).start();}

    所以現(xiàn)在,我再次創(chuàng)建一個(gè)名為r1的對(duì)象,但直接調(diào)用該接口的構(gòu)造方法。 再一次,實(shí)現(xiàn)它是單個(gè)抽象方法。 然后,我將對(duì)象傳遞給線程的構(gòu)造函數(shù)。

  • 實(shí)現(xiàn)一個(gè)匿名類(lèi):并且可以通過(guò)將類(lèi)聲明為匿名類(lèi)來(lái)使它更加簡(jiǎn)潔,這樣命名是因?yàn)樗鼜奈幢幻?我正在實(shí)例化可運(yùn)行的接口,并將其立即傳遞給線程構(gòu)造函數(shù)。 我仍在實(shí)現(xiàn)run方法,并且仍在調(diào)用線程的start方法。 public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("I am running");}}).start();}
  • 使用lambda表達(dá)式:在Java SE 8中,您可以重構(gòu)此代碼以顯著減少它并使它更具可讀性。 lambda版本可能看起來(lái)像這樣。 public static void main(String[] args) {Runnable r1 = () -> System.out.println("I am running");new Thread(r1).start();}

    我正在聲明具有可運(yùn)行類(lèi)型的對(duì)象,但是現(xiàn)在我使用一行代碼來(lái)聲明單個(gè)抽象方法實(shí)現(xiàn),然后再次將對(duì)象傳遞給線程的構(gòu)造函數(shù)。 您仍在實(shí)現(xiàn)可運(yùn)行的接口并調(diào)用它的run方法,但使用的代碼卻少得多。 此外,它可以進(jìn)行以下改進(jìn):

    public static void main(String[] args) { new Thread(() -> System.out.println("I am running")).start(); }

    這是有關(guān)Lambda項(xiàng)目的早期規(guī)格文檔中的重要一句話。

    Lambda表達(dá)式只能出現(xiàn)在將它們分配給類(lèi)型為功能接口的變量的位置。
    引用布萊恩·格茨

    讓我們分解一下以了解發(fā)生了什么。

  • 有哪些功能接口?

    功能接口是僅具有一個(gè)自定義抽象方法的接口。 即,不是從對(duì)象類(lèi)繼承的對(duì)象。 Java有許多這樣的接口,例如Runnable,Comparable,Callable,TimerTask等。

    在Java 8之前,它們被稱(chēng)為Single Abstract Method或SAM接口 。 在Java 8中,我們現(xiàn)在將它們稱(chēng)為功能接口 。

    Lambda表達(dá)式語(yǔ)法:

    這個(gè)lambda表達(dá)式返回了runnable接口的實(shí)現(xiàn)。 它有兩部分,由稱(chēng)為箭頭標(biāo)記或Lambda運(yùn)算符的新語(yǔ)法分開(kāi)。 lambda表達(dá)式的第一部分,在箭頭標(biāo)記之前,是您要實(shí)現(xiàn)的方法的簽名。

    在此示例中,這是一個(gè)無(wú)參數(shù)方法,因此僅用括號(hào)表示。 但是,如果我要實(shí)現(xiàn)一個(gè)接受參數(shù)的方法,則只需給出參數(shù)名稱(chēng)。 我不必聲明它們的類(lèi)型。

    因?yàn)榻涌谥挥幸粋€(gè)抽象方法,所以數(shù)據(jù)類(lèi)型是已知的。 lambda表達(dá)式的目標(biāo)之一是消除不必要的語(yǔ)法。 表達(dá)式的第二部分,在箭頭標(biāo)記之后,是單個(gè)方法主體的實(shí)現(xiàn)。

    如果僅是一行代碼(如本例所示),則您不需要任何其他內(nèi)容。 要使用多個(gè)語(yǔ)句實(shí)現(xiàn)方法主體, 請(qǐng)將它們括在花括號(hào)中 。

    Runnable r = ( ) -> {System.out.println("Hello!");System.out.println("Lambda!");};

    Lambda目標(biāo):

    Lambda表達(dá)式可以減少您需要編寫(xiě)的代碼量以及必須創(chuàng)建和維護(hù)的自定義類(lèi)的數(shù)量。

    如果您要實(shí)現(xiàn)一次使用的接口,那么創(chuàng)建另一個(gè)代碼文件或另一個(gè)命名類(lèi)并不總是很有意義。 Lambda表達(dá)式可以定義一次匿名實(shí)現(xiàn),以供一次性使用,并顯著簡(jiǎn)化代碼。

    定義和實(shí)例化功能接口

    為了開(kāi)始學(xué)習(xí)Lambda表達(dá)式,我將創(chuàng)建一個(gè)全新的功能接口。 一個(gè)具有單個(gè)抽象方法的接口,然后我將使用Lambda表達(dá)式實(shí)現(xiàn)該接口。

    您可以使用托管在github上的源代碼項(xiàng)目“ JavaSE8-Features”來(lái)導(dǎo)航項(xiàng)目代碼。

  • 沒(méi)有任何參數(shù)的方法,Lambda實(shí)現(xiàn)

    在我的源代碼中,我實(shí)際上將接口放入其自己的以lambda.interfaces結(jié)尾的子包中。 我將其命名為HelloInterface接口。為了實(shí)現(xiàn)帶有l(wèi)ambda表達(dá)式的接口,它必須具有一個(gè)抽象方法。 我將聲明一個(gè)返回void的公共方法,并將其命名為doGreeting 。 它不接受任何參數(shù),這是使接口可用于Lambda表達(dá)式的全部工作。 如果需要,可以使用新的注釋,該注釋已添加到Java SE 8中,稱(chēng)為功能接口 。

    /**** @author mohamed_taman*/ @FunctionalInterface public interface HelloInterface {void doGreeting();}

    現(xiàn)在,我準(zhǔn)備在lambda.impl包下創(chuàng)建一個(gè)新類(lèi)UseHelloInterface ,它將實(shí)例化我的功能接口( HelloInterface )如下:

    /*** @author mohamed_taman*/public class UseHelloInterface {public static void main(String[] args) {HelloInterface hello = ()-> out.println("Hello from Lambda expression");hello.doGreeting();} }

    運(yùn)行文件并檢查結(jié)果,它應(yīng)該運(yùn)行并輸出以下內(nèi)容。

    ------------------------------------------------------------------------------------ --- exec-maven-plugin:1.2.1:exec (default-cli) @ Java8Features --- Hello from Lambda expression ------------------------------------------------------------------------------------

    因此,當(dāng)您使用不接受任何參數(shù)的單個(gè)抽象方法時(shí),代碼就是這樣。 讓我們看一下帶有參數(shù)的外觀。

  • 具有任何參數(shù)的方法,Lambda實(shí)現(xiàn)

    在lambda.interfaces下 。 我將創(chuàng)建一個(gè)新接口并將其命名為CalculatorInterface 。 然后,我將聲明一個(gè)返回void的公共方法,并將其命名為doCalculate ,它將接收兩個(gè)整數(shù)參數(shù)value1和value2 。

    /*** @author mohamed_taman*/@FunctionalInterface public interface CalculatorInterface {public void doCalculate(int value1, int value2);}

    現(xiàn)在,我準(zhǔn)備在lambda.impl包下創(chuàng)建一個(gè)新類(lèi)Use CalculatorInterface ,它將實(shí)例化我的功能接口( CalculatorInterface ),如下所示:

    public static void main(String[] args) {CalculatorInterface calc = (v1, v2) -> {int result = v1 * v2;out.println("The calculation result is: "+ result);};calc.doCalculate(10, 5);}

    注意doCalculate()參數(shù),它們?cè)诮涌谥蟹謩e命名為value1和value2,但是您可以在此處為它們命名。 我將其命名為v1和v2。 我不需要在參數(shù)名稱(chēng)前插入int; 該信息是已知的,因?yàn)榫幾g器可以從功能接口方法簽名中推斷出此信息。運(yùn)行文件并檢查結(jié)果,它應(yīng)該運(yùn)行并輸出以下內(nèi)容。

    ------------------------------------------------------------------------------------ --- exec-maven-plugin:1.2.1:exec (default-cli) @ Java8Features --- The calculation result is: 50 ------------------------------------------------------------------------------------ BUILD SUCCESS

    始終牢記以下規(guī)則:

    同樣,您必須遵循該規(guī)則,即接口只能具有一個(gè)抽象方法 。 然后,可以使用lambda表達(dá)式實(shí)現(xiàn)該接口及其單一抽象方法。

  • 將內(nèi)置功能接口與lambda結(jié)合使用

    前面已經(jīng)描述了如何使用lambda表達(dá)式實(shí)現(xiàn)您自己創(chuàng)建的接口。現(xiàn)在,我將展示具有內(nèi)置接口的lambda表達(dá)式。 屬于Java運(yùn)行時(shí)的接口。 我將使用兩個(gè)示例。 我正在一個(gè)名為lambda.builtin的程序包中工作,這是練習(xí)文件的一部分。 我將從這堂課開(kāi)始。 UseThreading 。 在此類(lèi)中,我實(shí)現(xiàn)了Runnable接口。 這個(gè)接口是Java多線程體系結(jié)構(gòu)的一部分,我的重點(diǎn)是代碼的編寫(xiě)方式,而不是操作方式。 我將展示如何使用lambda表達(dá)式替換這些內(nèi)部類(lèi)。 我將注釋掉聲明兩個(gè)對(duì)象的代碼。 然后,我將重新聲明它們并使用lambdas進(jìn)行實(shí)現(xiàn)。 因此,讓我們開(kāi)始吧。

    public static void main(String[] args) {//Old version// Runnable thrd1 = new Runnable(){// @Override // public void run() { // out.println("Hello Thread 1."); // } //};/******************************************* Using lambda expression inner classes *******************************************/Runnable thrd1 = () -> out.println("Hello Thread 1.");new Thread(thrd1).start();// Old Version/*new Thread(new Runnable() {@Overridepublic void run() {out.println("Hello Thread 2.");}}).start();*//******************************************** Using lambda expression anonymous class ********************************************/new Thread(() -> out.println("Hello Thread 2.")).start();}

    讓我們看另一個(gè)例子。 我將使用比較器 。 比較器是Java中的另一個(gè)功能接口,具有單個(gè)抽象方法。 此方法是比較方法。打開(kāi)文件UseComparator類(lèi),并檢查注釋的代碼位,這是將其重構(gòu)為lambda表達(dá)式之前的實(shí)際代碼。

    public static void main(String[] args) {List<string> values = new ArrayList();values.add("AAA");values.add("bbb");values.add("CCC");values.add("ddd");values.add("EEE");//Case sensitive sort operationsort(values);out.println("Simple sort:");print(values);// Case insensetive sort operation with anonymous class/* Collections.sort(values, new Comparator<string>() {@Overridepublic int compare(String o1, String o2) {return o1.compareToIgnoreCase(o2);}}); */// Case insensetive sort operation with Lambdasort(values,(o1, o2) -> o1.compareToIgnoreCase(o2));out.println("Sort with Comparator");print(values);}

    和以前一樣,它不會(huì)為您提供任何性能優(yōu)勢(shì) 。 基本功能完全相同。 無(wú)論您聲明自己的類(lèi) ,使用內(nèi)部或匿名內(nèi)部類(lèi)還是lambda表達(dá)式 ,完全取決于您。

  • 在本系列的下一篇文章中,我們將探討和代碼如何使用lambda表達(dá)式, 過(guò)濾與謂詞接口的集合 , 遍歷與方法引用 的集合 ,在接口實(shí)現(xiàn)的默認(rèn)方法,并最終實(shí)現(xiàn)在接口的靜態(tài)方法 遍歷集合 。

    資源:

  • Java教程,Lambda表達(dá)式
  • JSR 310:日期和時(shí)間API
  • JSR 337:Java SE 8發(fā)行內(nèi)容
  • OpenJDK網(wǎng)站
  • Java平臺(tái),標(biāo)準(zhǔn)版8,API規(guī)范
  • 翻譯自: https://www.javacodegeeks.com/2014/07/java-se-8-new-features-tour-functional-programming-with-lambda-expression.html

    java lambda函數(shù)

    總結(jié)

    以上是生活随笔為你收集整理的java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。