最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中使用Lambda表達(dá)式和函數(shù)編程示例

 更新時(shí)間:2021年10月08日 14:44:12   作者:sofia  
這篇文章介紹了Java中使用Lambda表達(dá)式和函數(shù)編程示例,該文章會(huì)演示多個(gè)示列,分別是變量聲明上下文中的lambda、return語(yǔ)句上下文中的lambda、賦值上下文中的lambda、lambda在數(shù)組初始值設(shè)定項(xiàng)上下文中的用法等等,需要的朋友可以參考一下

1、簡(jiǎn)單介紹

第一個(gè)示例演示變量聲明上下文中的lambda。它將lambda()->{System.out.println(“running”);}分配給可運(yùn)行接口類型的變量r。

第二個(gè)示例類似,但演示了賦值上下文中的lambda(到先前聲明的變量r)。

第三個(gè)示例演示了return語(yǔ)句上下文中的lambda。它使用指定的文件擴(kuò)展名參數(shù)調(diào)用getFilter()方法以返回java.io.FileFilter對(duì)象。該對(duì)象被傳遞給java.io.File的listFiles()方法,該方法為每個(gè)文件調(diào)用過(guò)濾器,忽略與擴(kuò)展名不匹配的文件。getFilter()方法返回通過(guò)lambda表示的FileFilter對(duì)象。編譯器注意到lambda滿足此函數(shù)接口的boolean accept(文件路徑名)方法(兩者都有一個(gè)參數(shù),lambda主體返回一個(gè)布爾值),并將lambda綁定到FileFilter。

第四個(gè)示例演示了lambda在數(shù)組初始值設(shè)定項(xiàng)上下文中的用法?;趌ambdas創(chuàng)建了兩個(gè)java.nio.file.PathMatcher對(duì)象。每個(gè)PathMatcher對(duì)象根據(jù)其lambda主體指定的條件匹配文件。以下是相關(guān)代碼:

final PathMatcher matchers[] =
{
  (path) -> path.toString().endsWith("txt"),
  (path) -> path.toString().endsWith("java")
};


PathMatcher函數(shù)接口提供一個(gè)boolean matches(Path path)方法,該方法與lambda的參數(shù)列表及其主體的布爾返回類型一致。隨后調(diào)用此方法以確定在訪問當(dāng)前目錄和子目錄期間遇到的每個(gè)文件的匹配項(xiàng)(基于文件擴(kuò)展名)。

第五個(gè)示例演示線程構(gòu)造函數(shù)上下文中的lambda。

第六個(gè)示例演示了lambda上下文中的lambda,這表明lambda可以嵌套。

第七個(gè)示例演示了三元條件表達(dá)式(?:)上下文中的lambda:根據(jù)升序或降序排序從兩個(gè)lambda中選擇一個(gè)。

第八個(gè)(也是最后一個(gè))示例演示了強(qiáng)制轉(zhuǎn)換表達(dá)式上下文中的lambda。()->System.getProperty(“user.name”)lambda被強(qiáng)制轉(zhuǎn)換為PrivilegedAction<String>函數(shù)接口類型。此強(qiáng)制轉(zhuǎn)換解決了java.security.AccessController類中的歧義,該類聲明了以下方法:

static <T> T doPrivileged(PrivilegedAction<T> action)
static <T> T doPrivileged(PrivilegedExceptionAction<T> action)


問題是PrivilegedActionPrivilegedExceptionAction的每個(gè)接口都聲明了相同的T run()方法。由于編譯器無(wú)法確定哪個(gè)接口是目標(biāo)類型,因此在沒有強(qiáng)制轉(zhuǎn)換的情況下會(huì)報(bào)告錯(cuò)誤。

編譯清單4并運(yùn)行應(yīng)用程序。您應(yīng)該觀察以下輸出,該輸出假定LambdaDemo.java是當(dāng)前目錄中唯一的.java文件,并且該目錄不包含.txt文件:

running
running
Found matched file: '.\LambdaDemo.java'.
running
called
Washington
Sydney
Rome
Ottawa
Moscow
London
Jerusalem
Berlin
jeffrey

2、Lambdas和Scopes

術(shù)語(yǔ)范圍是指程序中名稱與特定實(shí)體(例如變量)綁定的部分。在程序的另一部分中,名稱可能綁定到另一個(gè)實(shí)體。lambda主體不會(huì)引入新的作用域。相反,它的作用域是封閉作用域。

3、Lambdas與局部變量

lambda主體可以定義局部變量。因?yàn)檫@些變量被認(rèn)為是封閉范圍的一部分,所以編譯器在檢測(cè)到lambda主體正在重新定義局部變量時(shí)將報(bào)告錯(cuò)誤。清單5演示了這個(gè)問題。

清單5。LambdaDemo.java(版本5)

public class LambdaDemo
{
   public static void main(String[] args)
   {
      int limit = 10;
      Runnable r = () -> {
                           int limit = 5;
                           for (int i = 0; i < limit; i++)
                              System.out.println(i);
                         };
   }
}

因?yàn)?code>limit已經(jīng)存在于封閉范圍(main()方法)中,lambda主體對(duì)limit的重新定義(int limit=5;)會(huì)導(dǎo)致編譯器報(bào)告以下錯(cuò)誤消息:錯(cuò)誤:變量limit已經(jīng)在方法main(字符串[])中定義。

4、Lambda體與局部變量

無(wú)論是源于lambda主體還是在封閉范圍內(nèi),局部變量在使用之前都必須初始化。否則,編譯器將報(bào)告錯(cuò)誤。

在lambda主體外部定義并從主體引用的局部變量或參數(shù)必須標(biāo)記為final或視為有效final(初始化后無(wú)法將該變量指定給)。試圖修改一個(gè)有效的最終變量會(huì)導(dǎo)致編譯器報(bào)告一個(gè)錯(cuò)誤,如清單6所示。

清單6。LambdaDemo.java(版本6)

public class LambdaDemo
{
   public static void main(String[] args)
   {
      int limit = 10;
      Runnable r = () -> {
                           limit = 5;
                           for (int i = 0; i < limit; i++)
                              System.out.println(i);
                         };
   }
}

限制實(shí)際上是最終的。lambda主體試圖修改此變量會(huì)導(dǎo)致編譯器報(bào)告錯(cuò)誤。這樣做是因?yàn)閒inal/final變量需要掛起,直到lambda執(zhí)行為止,這可能要在定義變量的代碼返回后很久才會(huì)發(fā)生。非最終/非有效最終變量不再存在。

5、Lambdas和'This'和'Super'關(guān)鍵字

lambda主體中使用的任何thissuper引用都被視為等同于其在封閉范圍中的用法(因?yàn)閘ambda不引入新范圍)。然而,匿名類的情況并非如此,如清單7所示。

清單7。LambdaDemo.java(版本7)

public class LambdaDemo
{
   public static void main(String[] args)
   {
      new LambdaDemo().doWork();
   }
   public void doWork()
   {
      System.out.printf("this = %s%n", this);
      Runnable r = new Runnable()
                       {
                          @Override
                          public void run()
                          {
                             System.out.printf("this = %s%n", this);
                          }
                       };
      new Thread(r).start();
      new Thread(() -> System.out.printf("this = %s%n", this)).start();
   }
}

清單7的main()方法實(shí)例化LambdaDemo并調(diào)用對(duì)象的doWork()方法來(lái)輸出對(duì)象的this引用,實(shí)例化一個(gè)實(shí)現(xiàn)Runnable的匿名類,創(chuàng)建一個(gè)線程對(duì)象,在其線程啟動(dòng)時(shí)執(zhí)行此Runnable,并創(chuàng)建另一個(gè)線程對(duì)象,其線程在啟動(dòng)時(shí)執(zhí)行lambda

編譯清單7并運(yùn)行應(yīng)用程序。您應(yīng)該觀察與以下輸出類似的情況:

this = LambdaDemo@776ec8df
this = LambdaDemo$1@48766bb
this = LambdaDemo@776ec8df


第一行顯示LambdaDemo的this引用,第二行顯示新可運(yùn)行范圍中不同的this引用,第三行顯示lambda上下文中的this引用。第三行和第一行匹配,因?yàn)?code>lambda的作用域嵌套在doWork()方法中;這在整個(gè)方法中具有相同的含義。

6、Lambdas和Exceptions

lambda主體不允許拋出比函數(shù)接口方法的throws子句中指定的更多的異常。如果lambda主體拋出異常,則函數(shù)接口方法的throws子句必須聲明相同的異常類型或其超類型??紤]清單8。

清單8。LambdaDemo.java(版本8)

import java.awt.AWTException;
import java.io.IOException;
@FunctionalInterface
interface Work
{
   void doSomething() throws IOException;
}
public class LambdaDemo
{
   public static void main(String[] args) throws AWTException, IOException
   {
      Work work = () -> { throw new IOException(); };
      work.doSomething();
      work = () -> { throw new AWTException(""); };
   }
}

清單8聲明了一個(gè)工作函數(shù)接口,其doSomething()方法聲明為拋出java.io.IOException。main()方法將拋出IOExceptionlambda分配給work,這是正常的,因?yàn)?code>IOException列在doSomething()的throws子句中。

main()接下來(lái)分配一個(gè)lambda,該lambda拋出java.awt.AWTException來(lái)工作。但是,編譯器不允許此賦值,因?yàn)?code>AWTException不是doSomething()的throws子句的一部分(當(dāng)然也不是IOException的子類型)。

7、預(yù)定義的功能接口

您可能會(huì)發(fā)現(xiàn)自己反復(fù)創(chuàng)建類似的功能接口。例如,您可以使用布爾IsConnection(連接c)方法創(chuàng)建CheckConnection函數(shù)接口,使用布爾isPositiveBalance(帳戶帳戶)方法創(chuàng)建CheckAccount函數(shù)接口。這是浪費(fèi)。

前面的示例公開了謂詞(布爾值函數(shù))的抽象概念。Oracle提供了常用功能接口的java.util.function包,以預(yù)測(cè)這些模式。例如,這個(gè)包的Predicate<T>功能接口可以用來(lái)代替CheckConnectionCheckAccount。

Predicate<T>提供一個(gè)boolean test(T t)方法,該方法根據(jù)其argument (t)計(jì)算該謂詞,當(dāng)T與predicate匹配時(shí)返回true,否則返回false。請(qǐng)注意,test()提供了與isConnected()isPositiveBalance()相同的參數(shù)列表。另外,請(qǐng)注意,它們都具有相同的返回類型(布爾值)。

清單9中的應(yīng)用程序源代碼演示了謂詞<T>。

清單9。LambdaDemo.java(版本9)

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
class Account
{
   private int id, balance;
   Account(int id, int balance)
   {
      this.balance = balance;
      this.id = id;
   }
   int getBalance()
   {
      return balance;
   }
   int getID()
   {
      return id;
   }
   void print()
   {
      System.out.printf("Account: [%d], Balance: [%d]%n", id, balance);
   }
}
public class LambdaDemo
{
   static List<Account> accounts;
   public static void main(String[] args)
   {
      accounts = new ArrayList<>();
      accounts.add(new Account(1000, 200));
      accounts.add(new Account(2000, -500));
      accounts.add(new Account(3000, 0));
      accounts.add(new Account(4000, -80));
      accounts.add(new Account(5000, 1000));
      // Print all accounts
      printAccounts(account -> true);
      System.out.println();
      // Print all accounts with negative balances.
      printAccounts(account -> account.getBalance() < 0);
      System.out.println();
      // Print all accounts whose id is greater than 2000 and less than 5000.
      printAccounts(account -> account.getID() > 2000 &&
                               account.getID() < 5000);
   }
   static void printAccounts(Predicate<Account> tester)
   {
      for (Account account: accounts)
         if (tester.test(account))
            account.print();
   }
}

清單9創(chuàng)建了一個(gè)基于數(shù)組的帳戶列表,其中有正余額、零余額和負(fù)余額。然后,它通過(guò)使用lambdas調(diào)用printAccounts()來(lái)演示謂詞<T>,以便打印出所有帳戶,僅打印出那些余額為負(fù)數(shù)的帳戶,以及僅打印出ID大于2000且小于5000的帳戶。

考慮lambda表達(dá)式帳戶->真。編譯器驗(yàn)證lambda是否匹配謂詞<T>的布爾測(cè)試(T)方法,它會(huì)這樣做——lambda提供單個(gè)參數(shù)(account),其主體始終返回布爾值(true)。對(duì)于這個(gè)lambda,test()被實(shí)現(xiàn)為執(zhí)行return true;。

編譯清單9并運(yùn)行應(yīng)用程序。我們能觀察以下輸出:

Account: [1000], Balance: [200]
Account: [2000], Balance: [-500]
Account: [3000], Balance: [0]
Account: [4000], Balance: [-80]
Account: [5000], Balance: [1000]
Account: [2000], Balance: [-500]
Account: [4000], Balance: [-80]
Account: [3000], Balance: [0]
Account: [4000], Balance: [-80]


Predicate<T>只是java.util.function的各種預(yù)定義函數(shù)接口之一。另一個(gè)示例是Consumer<T>,它表示接受單個(gè)參數(shù)但不返回結(jié)果的操作。與Predicate<T>不同,Consumer<T>預(yù)期通過(guò)副作用進(jìn)行操作。換句話說(shuō),它以某種方式修改了它的論點(diǎn)。

使用者的void accept(T)方法對(duì)其argument(T)執(zhí)行操作。當(dāng)出現(xiàn)在此函數(shù)接口的上下文中時(shí),lambda必須符合accept()方法的單獨(dú)參數(shù)和返回類型。

到此這篇關(guān)于Java中使用Lambda表達(dá)式和函數(shù)編程示例的文章就介紹到這了,更多相關(guān)Java中使用Lambda表達(dá)式和函數(shù)編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問題

    如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問題

    這篇文章主要介紹了如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java字符串相關(guān)類使用方法詳解

    Java字符串相關(guān)類使用方法詳解

    String、StringBuilder、StringBuffer還傻傻分不清,下面這篇文章主要給大家介紹了關(guān)于Java字符串相關(guān)類使用的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • SpringBoot監(jiān)視器的具體使用

    SpringBoot監(jiān)視器的具體使用

    Spring Boot監(jiān)視器是一個(gè)用于監(jiān)控和管理Spring Boot應(yīng)用程序的工具集,本文就來(lái)介紹一下SpringBoot監(jiān)視器的具體使用,感興趣的可以了解一下
    2025-01-01
  • Spring實(shí)例化對(duì)象的幾種常見方式

    Spring實(shí)例化對(duì)象的幾種常見方式

    Spring框架作為一個(gè)輕量級(jí)的控制反轉(zhuǎn)容器,為開發(fā)者提供了多種對(duì)象實(shí)例化的策略,通過(guò)這些策略,開發(fā)者可以更加靈活地控制對(duì)象的生命周期和依賴關(guān)系,無(wú)論是通過(guò)XML配置、注解配置還是Java配置,Spring都能輕松地實(shí)現(xiàn)對(duì)象的實(shí)例化,本文將介紹Spring實(shí)例化對(duì)象的幾種常見方式
    2024-12-12
  • java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)

    java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)

    這篇文章主要介紹了java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)映射的方式

    使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)映射的方式

    這篇文章主要介紹了使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)映射的方式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • 基于Java+SpringBoot實(shí)現(xiàn)人臉識(shí)別搜索

    基于Java+SpringBoot實(shí)現(xiàn)人臉識(shí)別搜索

    人臉識(shí)別搜索技術(shù)作為現(xiàn)代計(jì)算機(jī)視覺領(lǐng)域的重要研究方向之一,已經(jīng)在多個(gè)領(lǐng)域展現(xiàn)出巨大的應(yīng)用潛力,隨著信息技術(shù)的飛速發(fā)展,人臉識(shí)別搜索在多個(gè)領(lǐng)域得到了廣泛關(guān)注和應(yīng)用,本文旨在探討人臉識(shí)別搜索技術(shù)的背景、原理以及其在實(shí)際應(yīng)用中的意義和挑戰(zhàn)
    2023-08-08
  • 連續(xù)調(diào)用多個(gè)外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路

    連續(xù)調(diào)用多個(gè)外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路

    今天小編就為大家分享一篇關(guān)于連續(xù)調(diào)用多個(gè)外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 淺談Java中的高精度整數(shù)和高精度小數(shù)

    淺談Java中的高精度整數(shù)和高精度小數(shù)

    本篇文章主要介紹了淺談Java中的高精度整數(shù)和高精度小數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Maven2環(huán)境安裝與準(zhǔn)備工作詳解

    Maven2環(huán)境安裝與準(zhǔn)備工作詳解

    這篇文章主要為大家詳細(xì)介紹了Maven2環(huán)境安裝與準(zhǔn)備工作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評(píng)論

青州市| 吉木萨尔县| 德格县| 南川市| 和静县| 澄江县| 固原市| 丰县| 乾安县| 唐海县| 杂多县| 常熟市| 永泰县| 宁夏| 锡林浩特市| 岳普湖县| 伊春市| 正定县| 合山市| 许昌县| 龙州县| 阿巴嘎旗| 双城市| 重庆市| 象州县| 张家口市| 景洪市| 枣庄市| 自贡市| 南雄市| 温泉县| 星座| 陆丰市| 耿马| 漳浦县| 乐都县| 崇左市| 嘉黎县| 锦州市| 沂水县| 阜康市|