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