Ⅰ java 8 新特性中p->p.setLastName("Doe"));
這是lambda表達式,也就是匿名函數,對於
persons.forEach(p->p.setLastName("Doe"));
這句代碼,persons是一個list,forEach是一個內部迭代的方法,p->p.setLastName("Doe")是一個匿名函數對象。
這個語句等價於
for (Person p : persons) {
p.setLastName("Doe");
}
但是用for循環是外部迭代,速度略慢。
p->p.setLastName("Doe")
p是指list當中取出的對象,p可以自己定義,你寫a也可以,相應的就要變成
a->a.setLastName("Doe")
->是lambda表達式的符號,->左邊的對象去傳入lambda函數體p.setLastName("Doe"),是前面傳入的p去調用setLastName方法,如果要調用多個方法,那麼方法體要用花括弧包含
例如persons.forEach(p->{
p.setLastName("Doe")
System.out.println(p);
});
綜上所述
persons.forEach(p->p.setLastName("Doe"));
是把p->p.setLastName("Doe");這個函數對象,給了persons的迭代器,讓迭代器用這個函數去對集合中的每一個對象使用
有了lambda,你可以這樣定義一個新的線程
new Thread(() -> {System.out.println("hello word!");}).start();
() -> {System.out.println("hello word!");}這句語句其實就是runnable介面的實現對象,
編譯器會根據函數需要實現的介面去隱式轉換,Thread的構造方法需要傳遞Runnable介面的實現類,所以new Thread(() -> {System.out.println("hello word!");}).start();相當於
new Thread((Runnable)() -> {System.out.println("hello word!");}).start();
其中()是匹配介面中的無參函數,因為Runnable介面中run方法為無參所以是()
->指明前面是傳入參數,後面是函數體
有了lambda就能寫出更加漂亮的代碼,以及更少的工作量,實現一個方法的介面用匿名內部類的話看起來是冗餘代碼了
純手打望採納
Ⅱ (function($){...})(jQuery)是什麼意思
(function($){...})(jQuery),這意味著定義並執行一個使用參數jQuery並通過形式參數$接收匿名函數的匿名函數。
分析:
1,匿名函數定義:javasript函數(arg){...},這種形式在javascript中稱為匿名函數。 Arg是匿名函數的參數。
2,匿名函數調用:調用函數時,括弧和參數寫在函數之後。由於運算符的優先順序,函數本身需要使用括弧,即:(function(arg){...})(Param)這等效於使用參數arg定義匿名函數並使用param調用此匿名函數作為參數。
3,(function($){...})(jQuery)是使用實際參數jQuery定義和執行匿名函數,原因是在正式參數中使用$,以免與其他庫沖突,因此實際參數使用jQuery。
4,等效形式:var fn = function($){....}; fn(jQuery);實際上,這是可以理解的,但是應該注意,fn不存在,直接定義函數,然後運行。只需「壓縮」為以下(function($){...})(jQuery)。
(2)java匿名函數參數擴展閱讀:
匿名函數的聲明和使用:
首先,聲明一個直接分配給事件的匿名函數;
Window.onload = function(){};
使用匿名函數表達式。將匿名函數分配給變數。
聲明:var func = function(){};
呼叫:func();
自我執行功能:
可以從各種運算符開始但是普遍使用! ,如:!函數(參數列表){}(參數列表)。
使用()包裝函數和函數後的括弧,例如:(function(){}());
使用()值包裝函數值,例如:(function(){})();