日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java-lambda表達式入門看這一篇就夠了

瀏覽:13日期:2022-08-11 15:18:53
目錄概述語法函數式接口方法引用構造器引用變量作用域處理lambda表達式

Java-lambda表達式入門看這一篇就夠了

概述

Lambda表達式,也可稱為閉包,是JDK8的新特性。Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中),可以使代碼變的更加簡潔緊湊。Lambda表達式是一個可傳遞的代碼塊,可以在以后執行一次或多次。

名字起源是以前還沒有計算機時,邏輯學家Alonzo Church想要形式化的表示能有效計算的數學函數,使用了希臘字母lambda( λ lambda λ)來標記參數,從那以后,帶參數變量的表達式就被稱為lambda表達式。

lambda表達式本質是一個匿名函數,比如以下函數

public int add(int x, int y) { return x + y;}

可以轉換為:

(int x, int y) -> x + y;語法

語法格式如下

(parameters) -> expression或(parameters) ->{ statements; }

其中()用來描述參數列表,{}用來描述方法體,->是lambda運算符,讀作goes to。

可以包含顯示的return語句,如:

(String sirst,String second)->{if(first.length()<second.length())return -1;else if(first.length()>second.length())return 1;else return 0;}

可以沒有參數,但()不可缺省:()->{for(int i=0;i<10;i++)System.out.print(i);}

如果可以推導出參數類型,則可以忽略其類型:Comparator<String>cmp=(first,second)->first.length()-second.length();

特別注意不能只在某些分支返回一個值,這是不合法的,如:(int x)->{if(x>=0)return 1;}

常用示例:

ArrayList<Integer>list=new ArrayList<>();Collections.addAll(list,1,2,3,4,5);//遍歷list.forEach(e->{System.out.println(e);});//刪除指定值list.removeIf(e->e==3);//排序list.sort((o1,o2)->o2-o1);//遍歷(雙冒號操作符)list.forEach(System.out::println);函數式接口

Java中又很多封裝代碼塊的接口,如ActionListener、Comparator等,lambda表達式與這些接口時兼容的。對于只有一個抽象方法的接口,需要這種接口的對象時,就可以提供一個lambda表達式,這種接口稱為函數式接口

比如Arrays.sort()方法,它的第二個參數需要一個Comparator實例,而Comparator就是只有一個方法的接口,所以可以使用lambda表達式替代,可以把lambda表達式看作一個函數,而不是一個對象,如:

Arrays.sort(arrays,(first,second)->first.length()-second.length());

lambda表達式還可以轉換為接口,比如實現Runnable接口:

new Thread(() -> System.out.println('記得一鍵三連')).start();Runnable r = () -> System.out.println('(。・∀・)ノ');r.run();

再如之前提到的removeIf()方法,它的參數就是一個Predicate接口(位于java.util.function包),這個接口專門用來傳遞lambda表達式,如刪除一個數組列表所有null值:

list.removeIf(e->e==null)方法引用

當在Lambda表達式中直接調用了一個方法時可以使用,其寫法為目標引用::方法名稱。有時候,可能已經有現成的方法可以完成你想要傳遞到其他代碼的某個動作,如遍歷打印集合:

list.forEach(e->{System.out.println(e);});

我們可以直接把現成的println方法傳遞給它:

list.forEach(System.out::println);

它們是等價的,是一個方法引用的寫法。再如對字符串排序而不考慮大小寫,可以直接傳遞以下方法表達式:

Arrays.sort(strings,String::compareToIgnoreCase);

也就是說使用雙冒號操作符::來分離方法名與對象或類名:

object::instanceMethod Class::staticMethod Class::instanceMethod

對于前兩種情況,方法引用等價于提供方法參數的lambda表達式,如,Math::Pow等價于(x,y)->Math.pos(x,y)。對于第三種情況,第一個參數會成為方法的目標,如String::compareToIgnoreCase等同于(x,y)->x.compareToIgnoreCase(y)。

也可以在方法中引用this參數,如this::equals等價于x->this.equals(x),同樣的,使用super也是允許的。

(插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

構造器引用

構造器引用與方法引用很類似,只不過方法名為new,例如Person::new是Person類構造器的一個引用,如果有多個構造器,編譯器會取決于上下文。比如有一個字符串列表,可以把他轉換為一個Person對象數組,為此要在各個字符串上調用構造器。

可以用數組類型建立構造器引用,如int[]::new是一個構造器引用,它有一個參數即數組長度,等價于lambda表達式:x->new int[x];

在Java中無法構造泛型類型T的數組,而數組構造器引用就可克服這個限制。如表達式new T[n]會產生錯誤,因為這會改為new Object[n]。設我們需要一個Person對象數組,Stream接口有一個toArray方法可以返回Object數組:

Object[] people=stream.toArray();

以上得到的是一個Object引用數組,可以把Person[]::new傳入給toArray()方法,從而得到一個Person對象數組:

Object[] people=stream.toArray(Person[]::new);變量作用域

有時候,我們希望能夠在lambda表達式中訪問外圍方法或類中的變量,如下面例子:

public static void printTip(String text) { Runnable r = () -> System.out.println(text); r.run();}public static void main(String[] args) { String text='一鍵三連'; printTip(text);}

現在來看lambda表達式中的text變量,它并不是在這個lambda表達式中定義的,實際上是printTip方法的一個參數變量。但仔細想想,lambda表達式的代碼可能會在printTip調用返回很久以后才運行,而那時這個參數變量已經不存在了,如何保留text變量?

首先鞏固瞎lambda表達式的理解,lmabda表達式有3個部分:一個代碼塊、變量、自由變量的值(指非參數而且不在代碼中定義的變量)。在上面的例子中,lambda表達式有一個自由變量text,表示lambda表達式的數據結構必須存儲的值(這里的字符串“一鍵三連”),我們稱它被lambda表達式捕獲(captured)。

關于代碼塊和自由變量值有一個術語:閉包(closure),在Java中,lambda表達式就是閉包。

lambda表達式捕獲變量必須遵循的規則:捕獲的變量必須實際上必須是最終變量(effectively final),最終變量是指這個變量初始化之后就不會再為它賦新值,即在lambda表達式內外都不能在修改值。

如lambda內修改:

public static void printTip(String text) {Runnable r = () -> { System.out.println(text); text='修改值會報錯';};r.run(); } public static void main(String[] args) {String text='一鍵三連';printTip(text); }

lambda外修改:

public static void main(String[] args) {for(int i=0;i<5;i++){ //表達式外修改變量i報錯 Runnable r = () -> System.out.println(i); r.run();} }

此外,在方法中不能有同名的局部變量,lambda表達式也是如此:

public static void main(String[] args) {int first=666;//同名會報錯Comparator<String> cmp=(first,second)->first.length()-second.length(); }

對于lambda表達式中使用this關鍵字時,是指創建這個lambda表達式的方法餓this參數。

處理lambda表達式

使用lambda表達式的重點是延遲執行(deferred execution)。如果要立即執行代碼的畫完全可以直接執行而無需放到一個lambda表達式中,之所以希望以后在執行代碼,這有很多原因,如:

在一個單獨的線程中運行代碼 多次運行代碼 在算法的適當位置運行代碼 發生某種情況時執行代碼 只有在必要時才運行代碼

設想要重復一個動作n次,將這個動作和重復次數,傳遞到一個repeat方法,要接受這個lambda表達式需要選擇一個函數式接口,在這里我們可以使用Runnable接口,后面給出Java API中提供的最重要的函數式接口。

public static void repeat(int n,Runnable action){for(int i=0;i<n;i++) action.run(); } public static void main(String[] args) {repeat(10,()-> System.out.println('一鍵三連')); }

函數式接口

函數式接口 參數類型 返回類型 抽象方法名 描述 其他方法 Runnable 無 void run 作為無參數或返回值的動作執行Supplier<T> 無 T get 提供一個T類型的值Consumer<T> T void accept 處理一個T類型的值 addThen BiConsumer<T,U> T,U void accept 處理T和U類型的值 addThen Function<T,R> T R apply 有一個T類型參數的函數 compose,addThen,idenity BiFunction<T,U,R> T,U R apply 有T和U類型參數的函數 addThen UnaryOperator<T> T T apply 類型T上的一元操作符 compose,addThen,identity BinaryOperator<T> T,T T apply 類型T上的二元操作符 addThen,maxBy,minBy PreDicate<T> T boolean test 布爾值函數 add,or,negate,isEqual BiPredicate T,U boolean test 有兩個參數的布爾值函數 add,or,negate

現在讓這個例子更復雜一些,我們希望知道這個動作出現在哪一次迭代中。為此需要選擇一個合適的函數式接口,其中要包含一個方法,這個方法有一個int參數而且返回類型為void,如下所示:

public interface IntConsumer{void accept(int value); } public static void repeat(int n,IntConsumer action){for(int i=0;i<n;i++) action.accept(i); } public static void main(String[] args) {repeat(10,i-> System.out.println(9-i)); }

下表列出了基本類型int、long和double的34個可能的規范,最好使用這些特殊化規范來減少自動裝箱:

函數式接口 參數類型 返回類型 抽象方法名 BooleanSupplier none boolean getAsBoolean P P PSupplier none p p p getAs P P P P P PConsumer p p p void accept Obj P P PConsumer<T> T, p p p void accept P P PFunction<T> p p p T apply P P PToQFunction p p p q q q applyAs Q Q Q To P P PFunction<T> T p p p applyAs P P P To P P PBiFunction<T,U> T,U p p p applyAs P P P P P PUnaryOperator p p p p p p applyAs P P P P P PBinaryOperator p p p, p p p p p p applyAs P P P P P PPredicate p p p boolean test

p p p, q q q為int,long,double;P P P, Q Q

以上就是Java-lambda表達式入門看這一篇就夠了的詳細內容,更多關于Java-lambda表達式入門的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成午夜精品一区二区三区软件| 日本va欧美va精品发布| 国产精品手机在线播放| 精品福利久久久| 欧美成人亚洲| 婷婷综合电影| 久久中文字幕导航| 国产高清一区| 欧美视频久久| 欧美91精品| 你懂的网址国产 欧美| 久久精品国产www456c0m| 亚洲欧洲专区| 99久久婷婷这里只有精品| 亚洲欧美日韩精品一区二区| 日韩成人一级| 国产超碰精品| 日韩午夜视频在线| 麻豆视频久久| 国产精品嫩草99av在线| 国产精品成人一区二区网站软件| 国产白浆在线免费观看| 亚洲五月综合| 亚洲天堂资源| 国产真实久久| 精品视频国产| 视频一区欧美精品| 99久久夜色精品国产亚洲狼| 国产精品免费精品自在线观看| 性色一区二区| 日韩久久精品网| 亚洲精品午夜av福利久久蜜桃| 精品国产乱码久久久久久1区2匹| 日韩精品第一| 亚洲精品麻豆| 蜜臀av亚洲一区中文字幕| 欧美色图国产精品| 日韩电影二区| 在线看片国产福利你懂的| 九九99久久精品在免费线bt| 国产日产高清欧美一区二区三区 | 国产一在线精品一区在线观看| 福利欧美精品在线| 色网在线免费观看| 久久精品成人| 另类激情亚洲| 国产视频一区免费看| 午夜影院欧美| 亚洲国产不卡| 免费在线成人网| 免费视频久久| 四虎国产精品免费久久| 亚洲另类av| 亚洲人成亚洲精品| 国产欧美69| www在线观看黄色| 亚洲福利精品| 亚洲一区二区毛片| 亚洲婷婷丁香| 亚洲18在线| 在线亚洲观看| 日韩二区三区四区| 美女久久久久久| 日韩在线观看| 视频在线观看国产精品| 欧美视频二区| 国产精品久久久久77777丨| 狂野欧美性猛交xxxx| 日韩欧美精品综合| 亚洲黄页一区| 国产精品成人3p一区二区三区| 美女久久99| 99精品综合| 欧美影院精品| 91精品一区二区三区综合| 免费日韩精品中文字幕视频在线| 日韩视频1区| 日韩大片在线| 日韩区一区二| 国产91一区| 国产精品99久久免费| 欧美久久精品一级c片| 国产精一区二区| 中文一区二区| 麻豆视频在线观看免费网站黄 | 丝袜亚洲另类欧美| 免费高潮视频95在线观看网站| 精品视频自拍| 国产视频一区欧美| 国产成人精品一区二区三区在线| 偷拍欧美精品| 福利视频一区| 蜜桃久久久久久| 日韩成人亚洲| 精品一区视频| 91精品一区| 亚洲日韩中文字幕一区| 久久久久久久久久久妇女| 国产亚洲电影| 亚洲有吗中文字幕| 亚洲精品一区二区在线看| 中文字幕高清在线播放| 国产精品视频一区二区三区四蜜臂| aⅴ色国产欧美| 欧美日韩国产免费观看视频| 中文字幕高清在线播放| 国产精品久久| 国产精品第十页| 国产欧美日韩一级| 欧美伊人影院| 国产毛片精品| 乱一区二区av| 国产精品二区影院| 国产精品黄网站| 欧美黑人巨大videos精品| 日韩高清电影免费| 日韩中文字幕| 欧美日韩18| 美腿丝袜亚洲三区| 日韩欧美精品综合| 国产+成+人+亚洲欧洲在线| 久久久久久久久成人| 97欧美在线视频| 91精品亚洲| 99tv成人| 一本色道精品久久一区二区三区| 免费av一区| 综合激情网...| 国产情侣一区| 欧美丰满日韩| 久久精品高清| 亚洲欧美一级| 精品资源在线| 在线日韩一区| 日韩av中文在线观看| 韩国一区二区三区视频| 亚洲小说欧美另类婷婷| 亚洲免费影院| 久久精品国产99国产精品| 国产一区二区亚洲| 九一国产精品| 国产乱子精品一区二区在线观看| 成人影视亚洲图片在线| 91精品91| 国产精品亚洲综合久久| 日韩国产综合| 日本在线不卡视频| 色偷偷色偷偷色偷偷在线视频| 久久大逼视频| 91一区二区三区四区| 蜜桃av一区二区三区电影| 精品国产黄a∨片高清在线| 久久夜夜操妹子| 日韩av在线免费观看不卡| 日韩欧美2区| 日本少妇精品亚洲第一区| 日韩精品91亚洲二区在线观看| 日韩av一区二区三区四区| 激情黄产视频在线免费观看| 欧美精品一区二区久久| 国产亚洲久久| 天海翼精品一区二区三区| 丰满少妇一区| 在线亚洲精品| 国产精品红桃| 欧美日韩一二三四| 日韩av中文在线观看| 性欧美69xoxoxoxo| 国产精品亚洲人成在99www | 久久av一区二区三区| 日本精品久久| 欧美 日韩 国产精品免费观看| 国产日韩欧美中文在线| 蜜臀精品一区二区三区在线观看| 日韩三区免费| 久久电影tv| 国产不卡一区| 国产videos久久| 国产一区2区在线观看| 亚洲毛片在线| 亚洲特色特黄| 精品高清久久| 成人国产精品久久| 热久久久久久久| 日本综合视频| 日韩一区二区在线免费| 亚洲影院天堂中文av色| 精品一级视频| 久久性天堂网| 日本久久一区| 亚洲香蕉网站| 国精品一区二区| 国产毛片久久久| 国产亚洲福利| 国产91欧美| 久久亚洲美女| 精品一区二区三区亚洲| 日韩精品a在线观看91| 亚洲人成精品久久久| 伊人影院久久|