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就能寫出更加漂亮的代碼,以及更少的工作量,實現壹個方法的接口用匿名內部類的話看起來是冗余代碼了
純手打望采納