JAVA8之lambda表达式
lambda表達(dá)式是java8開(kāi)始支持的一個(gè)特性,方便好用,使用lambda表達(dá)式進(jìn)行編程可以明顯提升開(kāi)發(fā)效率,并且在執(zhí)行效率上也有一定的優(yōu)化。下面回顧一下lambda表達(dá)式的兩部分常見(jiàn)用途。
一、針對(duì)函數(shù)式接口編程,匿名內(nèi)部類(lèi)的實(shí)現(xiàn)。
首先用個(gè)人語(yǔ)言來(lái)描述下函數(shù)式編程,就是接口中只含有一個(gè)接口方法,然后生成這個(gè)接口的實(shí)現(xiàn)類(lèi)時(shí)只需要實(shí)現(xiàn)這一個(gè)接口方案就能構(gòu)成一個(gè)實(shí)現(xiàn)類(lèi),此時(shí)就可以使用lambda表達(dá)式來(lái)實(shí)現(xiàn)這種匿名內(nèi)部類(lèi),他是以一種函數(shù)的形式來(lái)表達(dá)的,前面為一個(gè)函數(shù)的輸入,然后yige “->”后面接這個(gè)函數(shù)的方法體,下面以?xún)蓚€(gè)常見(jiàn)的例子來(lái)看,最常見(jiàn)的便是創(chuàng)建線程時(shí)u,這時(shí)我們最常使用匿名內(nèi)部類(lèi)的時(shí)候,在沒(méi)有l(wèi)ambda表達(dá)式時(shí),我們是這樣實(shí)現(xiàn)的
Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("run ... ");} };Thread thread = new Thread(runnable); thread.start();runnable這個(gè)接口中只有一個(gè)未實(shí)現(xiàn)的方法run,所以我們可以使用lambda表達(dá)式來(lái)實(shí)現(xiàn)它,我們可以將上述代碼簡(jiǎn)化為
new Thread(()->System.out.println("run ... ")).start();()是run方法沒(méi)有參數(shù),所以以()表示,->以后為run方法的實(shí)現(xiàn),這個(gè)就很想函數(shù)的形式,所以稱(chēng)為函數(shù)式編程
還有個(gè)我們比較常見(jiàn)的例子就是比較器,在沒(méi)使用lambda表達(dá)式時(shí)是如下所示
List<String> list = Arrays.asList("aa", "abc", "abcdf", "v","java"); Collections.sort(list, new Comparator<String>(){// 接口名 @Overridepublic int compare(String s1, String s2){// 方法名if(s1 == null)return -1;if(s2 == null)return 1;return s1.length()-s2.length();} });使用了lambda表達(dá)式時(shí)這樣
List<String> list = Arrays.asList("aa", "abc", "abcdf", "v","java");Collections.sort(list, (s1, s2) ->{// 省略參數(shù)表的類(lèi)型 if(s1 == null) return -1; if(s2 == null) return 1; return s1.length()-s2.length(); }); Comparator接口只有compare一個(gè)接口方法,其中(s1, s2)是compare方法傳入的參數(shù),->以后為compare方法的實(shí)現(xiàn)。(s1,s2)沒(méi)有參數(shù)類(lèi)型,是因?yàn)閖ava編譯器可以通過(guò)后面參數(shù)的使用位置推斷出參數(shù)的類(lèi)型,故可以省略,當(dāng)然,我們也可以不省略,寫(xiě)成(String s1,String s2)
二,流式操作,批量處理集合
在對(duì)集合的操作上使用lambda表達(dá)式其一是簡(jiǎn)化代碼,不用寫(xiě)太多無(wú)用且必須的語(yǔ)句,其二,sream的流式操作默認(rèn)使用了多線程的形式,可以在在待處理集合數(shù)據(jù)量大的情況下顯著提升效率。
sream分為中間操作和結(jié)束操作兩部分
其中詳情見(jiàn)下表
| 中間操作 | concat() distinct() filter() flatMap() limit() map() peek()? skip() sorted() parallel() sequential() unordered() |
| 結(jié)束操作 | allMatch() anyMatch() collect() count() findAny() findFirst()? forEach() forEachOrdered() max() min() noneMatch() reduce() toArray() |
?
其中中間方法是對(duì)集合進(jìn)行操作,而結(jié)束操作是將處理完類(lèi)型的sream的對(duì)象轉(zhuǎn)換為結(jié)果的集合或者數(shù)值、字符串,流式操作的含義就是進(jìn)行完一個(gè)處理后還可以繼續(xù)以流的方式繼續(xù)處理,比如先去重,然后排序。下面介紹下常用的幾個(gè)方法
distinct,去重 Stream<String> stream= Stream.of("aa", "abc", "abcdf", "v","java");
stream.distinct() .forEach(str -> System.out.println(str)); sort,排序 Stream<String> stream= Stream.of("aa", "abc", "abcdf", "v","java");
stream.sorted((str1, str2) -> str1.length()-str2.length()) .forEach(str -> System.out.println(str));
?
轉(zhuǎn)載于:https://www.cnblogs.com/Lliuyao/p/9980718.html
總結(jié)
以上是生活随笔為你收集整理的JAVA8之lambda表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python偏函数应用举例-路灯指示牌
- 下一篇: Mars的简单使用