日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Lambda用在哪里?幾種場(chǎng)景?

目錄

  1. 前言
  2. Lambda表達(dá)式語(yǔ)法
  3. 案例
  4. 幾種場(chǎng)景
  5. 口訣
  6. 函數(shù)式接口
  7. Lambda用在哪里
  8. 總結(jié)

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

Lambda的語(yǔ)法極為簡(jiǎn)單,類似如下結(jié)構(gòu):

 
 
 
 
  1. (parameters) -> expression 

 
 
 
 
  1. (parameters) -> { statements; } 

Lambda表達(dá)式由三部分組成:

1、paramaters:類似方法中的形參列表,這里的參數(shù)是函數(shù)式接口里的參數(shù)。這里的參數(shù)類型可以明確的聲明也可不聲明而由JVM隱含的推斷,另外當(dāng)只有一個(gè)推斷類型時(shí)可以省略掉圓括號(hào)。

2、->:可理解為“被用于”的意思

3、方法體:可以是表達(dá)式也可以代碼塊,是函數(shù)式接口里方法的實(shí)現(xiàn)。代碼塊可返回一個(gè)值或者什么都不返回,這里的代碼塊塊等同于方法的方法體。如果是表達(dá)式,也可以返回一個(gè)值或者什么都不反回。

案例

Lambda表達(dá)式本質(zhì)上是一個(gè)匿名方法,如

 
 
 
 
  1. public int add(int x,int y){ 
  2.     return x + y; 
  3. }  

用Lambda表達(dá)式可以寫(xiě)成

 
 
 
 
  1. (int x,int y) -> {return x + y;} 

左側(cè)即是函數(shù)方法的參數(shù),右側(cè)就是實(shí)現(xiàn)主體。

可以更簡(jiǎn)潔一點(diǎn),就是參數(shù)類型可以不寫(xiě),java會(huì)根據(jù)上下文推斷出來(lái)

 
 
 
 
  1. (x, y) -> {return x + y;} 

如果實(shí)現(xiàn)主體為一條語(yǔ)句,return也可以省掉,花括號(hào)也省掉。

 
 
 
 
  1. (x, y) -> x + y; 

幾種場(chǎng)景

接口的抽象方法有幾種場(chǎng)景,我們來(lái)看一下

1、無(wú)參數(shù)、無(wú)返回值

 
 
 
 
  1. public void print(){ 
  2.     System.out.println("Hello Lambda!"); 
  3. }  

Lambda表達(dá)式寫(xiě)法

 
 
 
 
  1. () -> System.out.println("Hello Lambda!"); 

典型就是Runnable中的run方法

 
 
 
 
  1. public interface Runnable { 
  2.  public abstract void run(); 

之前的寫(xiě)法

Lambda的寫(xiě)法

 
 
 
 
  1. Runnable r1 = () -> System.out.println("Hello Lambda!"); 
  2. r1.run(); 

2、1個(gè)參數(shù),無(wú)返回值

 
 
 
 
  1. public void print(String str){ 
  2.     System.out.println("Hello " + str); 
  3. }  

Lambda的寫(xiě)法

 
 
 
 
  1. (str) -> System.out.println("Hello " + str); 

如果是1個(gè)參數(shù),可以去掉小括號(hào)

 
 
 
 
  1. str -> System.out.println("Hello " + str); 

3、多個(gè)參數(shù)、有返回值,且多條語(yǔ)句

 
 
 
 
  1. public int add(int x,int y){ 
  2.     System.out.println("執(zhí)行加法運(yùn)算!"); 
  3.  return x+y; 
  4. }  

Lambda的寫(xiě)法

 
 
 
 
  1. (x,y) -> { 
  2.  System.out.println("執(zhí)行加法運(yùn)算!"); 
  3.  return x+y; 

此處因?yàn)槭嵌鄺l語(yǔ)句,所以一定要用花括號(hào)。

4、多個(gè)參數(shù),有返回值,且一條語(yǔ)句,省掉花括號(hào)以及return

 
 
 
 
  1. public int add(int x,int y){ 
  2.     return x + y; 
  3. }  

用Lambda表達(dá)式可以寫(xiě)成

 
 
 
 
  1. (x, y) -> x + y; 

口訣

上聯(lián): 左右遇一括號(hào)省

左側(cè)是1個(gè)參數(shù),可以省掉括號(hào);右側(cè)是一條語(yǔ)句可以省掉花括號(hào)

下聯(lián):左側(cè)推斷類型省

左側(cè)的參數(shù)類型可以省掉,有JAVA根據(jù)上下文推斷

橫批:能省則省

能夠省掉盡量省掉,使得代碼簡(jiǎn)潔

函數(shù)式接口

我們來(lái)看看什么是函數(shù)式接口:

若接口中只有一個(gè)抽象方法的接口稱為函數(shù)式接口

可以使用注解@FunctionlInterface來(lái)標(biāo)識(shí),可以檢查是否是函數(shù)式接口

我們來(lái)定義一個(gè)運(yùn)算接口

 
 
 
 
  1. @FunctionalInterface //函數(shù)式接口聲明 
  2. public interface MyFunction { 
  3.  public Integer getValue(Integer num); 

注意必須只有一個(gè)抽象方法需要實(shí)現(xiàn)

通用函數(shù)實(shí)現(xiàn)

 
 
 
 
  1. public Integer operation(Integer num,MyFunction mf){ 
  2.  return mf.getValue(num); 

測(cè)試

Lambda用在哪里

其實(shí)上面的就知道lambda用在哪的,就是配合函數(shù)式接口使用的。lambda表達(dá)式必須和函數(shù)式接口的抽象函數(shù)描述一樣的參數(shù)類型,它的返回類型也必須和抽象函數(shù)的返回類型兼容,并且他能拋出的異常也僅限于在函數(shù)的描述范圍中。

自定義一個(gè)函數(shù)接口,F(xiàn)為參數(shù),T為返回值

 
 
 
 
  1. @FunctionalInterface 
  2. interface Converter
  3.  T convert(F from); 

傳統(tǒng)匿名類方式

一定要觀察好上面的參數(shù)類型和返回類型,因?yàn)槎x的時(shí)候采用的是范型。

Lambda表達(dá)式方式

上面的兩種實(shí)現(xiàn)都是等價(jià)的。我們?cè)趤?lái)看看常用的線程例子

感覺(jué)代碼還是比較多,用Lambda來(lái)寫(xiě)

new Thread(() -> System.out.println("hello lambda")).start();

非常簡(jiǎn)潔是吧。這個(gè)就是Lambda的優(yōu)美的體現(xiàn)

總結(jié)

看到這里小伙伴們是不是感覺(jué)Lambda表達(dá)式的好處了,當(dāng)然我們要經(jīng)常寫(xiě),才能熟練掌握。lambda還有一些高級(jí)用法,老顧下次再繼續(xù)跟小伙伴們介紹。


網(wǎng)站名稱:Lambda用在哪里?幾種場(chǎng)景?
URL分享:http://www.5511xx.com/article/dhhedhj.html