java1 8 新特性 Lambda表示式

2021-09-05 07:01:14 字數 3125 閱讀 5246

先來體驗一下lambda最直觀的優點:簡潔**

//匿名內部類

comparatorcpt = new comparator()

};treesetset = new treeset<>(cpt);

system.out.println("*************************");

//使用lambda表示式

comparatorcpt2 = (x,y) -> integer.compare(x,y);

treesetset2 = new treeset<>(cpt2);

只需要一行**,極大減少**量!!

這樣乙個場景,在**瀏覽商品資訊時,經常會有條件的進行篩選瀏覽,例如要選顏色為紅色的、**小於8000千的….

// 篩選顏色為紅色

public  listfilterproductbycolor(listlist)

}return prods;

}// 篩選**小於8千的

public  listfilterproductbyprice(listlist)

}return prods;

}我們發現實際上這些過濾方法的核心就只有if語句中的條件判斷,其他均為模版**,每次變更一下需求,都需要新增乙個方法,然後複製黏貼,假設這個過濾方法有幾百行,那麼這樣的做法難免笨拙了一點。如何進行優化呢?

優化一:使用設計模式

定義乙個mypredicate介面

public inte***ce mypredicate

如果想要篩選顏色為紅色的商品,定義乙個顏色過濾類

public class colorpredicate implements mypredicate

定義過濾方法,將過濾介面當做引數傳入,這樣這個過濾方法就不用修改,在實際呼叫的時候將具體的實現類傳入即可。

public listfilterproductbypredicate(listlist,mypredicatemp)

}return prods;

}例如,如果想要篩選**小於8000的商品,那麼新建乙個**過濾類既可

public class pricepredicate implements mypredicate

}這樣實現的話可能有人會說,每次變更需求都需要新建乙個實現類,感覺還是有點繁瑣呀,那麼再來優化一下

優化:使用lambda表示式

定義過濾方法:

public listfilterproductbypredicate(listlist,mypredicatemp)

}return prods;

}測試方法:

public void test()

}使用lambda表示式進行過濾,這裡就不需要實現mypredicate 介面的pricepredicate類了

@test

public void test()

}在jdk1.8中還有更加簡便的操作 stream api

優化四:使用stream api

甚至不用定義過濾方法,直接在集合上進行操作

// 使用jdk1.8中的stream api進行集合的操作

@test

public void test()

lmabda表示式的語法總結: () -> ();

前置       語法

無引數無返回值    () -> system.out.println(「hello world」)

有乙個引數無返回值    (x) -> system.out.println(x)

有且只有乙個引數無返回值       x -> system.out.println(x)

有多個引數,有返回值,有多條lambda體語句    (x,y) -> ;

有多個引數,有返回值,只有一條lambda體語句 (x,y) -> ***x

口訣:左右遇一省括號,左側推斷型別省

注:當乙個介面中存在多個抽象方法時,如果使用lambda表示式,並不能智慧型匹配對應的抽象方法,因此引入了函式式介面的概念

什麼是函式式介面?

簡單來說就是只定義了乙個抽象方法的介面(

object

類的public

方法除外),就是函式式介面,並且還提供了註解:

@functionalinte***ce

常見的四大函式式介面

consumer 《t》:消費型介面,有參無返回值

@test

public void test()

/***  consumer消費型介面

* @param str

* @param con

*/public void changestr(string str, consumercon)

@test

public void test2()

/***  supplier供給型介面

* @param sup

* @return

*/public string getvalue(suppliersup)

@test

public void test3()

/***  function函式式介面

* @param num

* @param fun

* @return

*/public long changenum(long num, functionfun)

public void test4()

/***  predicate斷言型介面

* @param str

* @param pre

* @return

*/public boolean changeboolean(string str, predicatepre)

在四大核心函式式介面基礎上,還提供了諸如bifunction、binaryoperation、tointfunction等擴充套件的函式式介面,都是在這四種函式式介面上擴充套件而來的,不做贅述。

總結:函式式介面的提出是為了讓我們更加方便的使用lambda表示式,不需要自己再手動建立乙個函式式介面,直接拿來用就好了,貼

方法引用

若lambda體中的內容有方法已經實現了,那麼可以使用「方法引用」

也可以理解為方法引用是lambda表示式的另外一種表現形式並且其語法比lambda表示式更加簡單

java1 8 新特性 引用形式

三種表現形式 1.物件 例項方法名 2.類 靜態方法名 3.類 例項方法名 lambda引數列表中第乙個引數是例項方法的呼叫 者,第二個引數是例項方法的引數時可用 public void test 格式 classname new public void test2 格式 type new publ...

java 18 異常處理

1 異常處理執行順序 當出現異常時,異常處理各部分執行順序 測試異常處理各個位置執 況 public static void textexception catch exception e finally 執行結果 設定返回值的情況 3 注釋掉finally中的return。catch中不注釋掉。測...

JDK1 8新特性 Lambda表示式

lambda表示式 函式式程式設計思想 物件導向 必須通過物件的形式來做事情.函式式思想 強調做什麼 注重結果 而不是怎麼做.lambda的格式 一些引數 介面中的抽象方法的引數,有就寫上,沒有空著 乙個箭頭 傳遞 把引數傳遞給 中的方法體 一段 重寫介面中的抽象方法的方法體 標準格式 引數型別 引...