網(wǎng)站推廣服務(wù)網(wǎng)站連鎖微信朋友圈廣告30元 1000次
目錄
?什么是Lambda表達(dá)式
?Lambda表達(dá)式的語(yǔ)法
?函數(shù)式接口
??Lambda表達(dá)式的使用
??變量捕獲
??Lambda表達(dá)式在集合中的使用
?Collection的foreach():
?List的sort():
?Map的foreach()
?什么是Lambda表達(dá)式
Lambda 表達(dá)式是 Java SE 8中一個(gè)重要的新特性,它是一種匿名函數(shù),常作為函數(shù)式編程的一部分,用于向函數(shù)傳遞行為作為參數(shù),或者用于將行為作為返回值返回。 Lambda表達(dá)式提供了一個(gè)正常的參數(shù)列表和一個(gè)使用這些參數(shù)的主體(body, 可以是一個(gè)表達(dá)式或一個(gè)代碼塊)。
?Lambda表達(dá)式的語(yǔ)法
基本語(yǔ)法 : (parameters) ->{ 方法體 }①. paramaters :類似方法中的形參列表,這里的參數(shù)是函數(shù)式接口里的參數(shù)。(參數(shù)類型可以明確的聲明 ,也可不聲明而由 JVM 隱含的推斷;當(dāng)只有一個(gè)推斷類型時(shí)可以省略掉圓括號(hào))②. -> :可理解為 “ 被用于 ” 的意思③. 方法體 :可以是表達(dá)式也可以代碼塊,是函數(shù)式接口里方法的實(shí)現(xiàn)。(代碼塊可返回一個(gè)值或者什么都不返回,這里的代碼塊塊等同于方法的方法體;如果是表達(dá)式,也可以返回一個(gè)值或者什么都不反回)//1. 不需要參數(shù),返回值為2 ()->2; //2. 接收一個(gè)參數(shù)(數(shù)字類型),返回其2倍的值 x->2*x; //3. 接受2個(gè)參數(shù)(數(shù)字),并返回他們的和 (x,y)->x+y; //4. 接收2個(gè)int型整數(shù),返回他們的乘積 (int x,int y)->x*y; //5. 接受一個(gè)string對(duì)象,并在控制臺(tái)打印,不返回任何值 (String s)->System.out.print(s);
注:①.->前只有一個(gè)參數(shù),()可以省略;②.->后只有一條語(yǔ)句,{}可以省略;③.->后只有return語(yǔ)句,return可以去掉;④.()里 的參數(shù)類型可以省略,如果要省略,每個(gè)參數(shù)的類型都要省略。
?函數(shù)式接口
要了解 Lambda 表達(dá)式 , 還需要先了解什么是函數(shù)式接口。函數(shù)式接口是一種特殊的接口,它的接口里有且只有一個(gè)抽象方法:@FunctionalInterface interface A {//抽象方法有且只有一個(gè)public void fun();//可以有被default修飾的具體方法default void fun2() {System.out.println("JDK1.8新特性,default默認(rèn)方法可以有具體的實(shí)現(xiàn)");} }
注:
①.如果一個(gè)接口只有一個(gè)抽象方法,那么該接口就是一個(gè)函數(shù)式接口。
②.可以在接口上方加上@FunctionalInterface注釋,讓編譯器幫助我們檢查該接口是不是一個(gè)函數(shù)式接口。
③.JDK1.8之后,函數(shù)式接口里允許存在default方法修飾的具體方法。
??Lambda表達(dá)式的使用
我們先定義幾個(gè)函數(shù)式接口:
//無返回值無參數(shù) @FunctionalInterface interface NoParameterNoReturn {void test(); } //無返回值一個(gè)參數(shù) @FunctionalInterface interface OneParameterNoReturn {void test(int a); } //無返回值多個(gè)參數(shù) @FunctionalInterface interface MoreParameterNoReturn {void test(int a,int b); }//有返回值無參數(shù) @FunctionalInterface interface NoParameterReturn {int test(); } //有返回值一個(gè)參數(shù) @FunctionalInterface interface OneParameterReturn {int test(int a); }//有返回值多參數(shù) @FunctionalInterface interface MoreParameterReturn {int test(int a,int b); }
下面我們通過Lambda表達(dá)式對(duì)上面幾個(gè)函數(shù)式接口進(jìn)行實(shí)例化操作:
public class Test {public static void main(String[]args) {//無參數(shù)無返回值NoParameterNoReturn noParameterNoReturn = () -> {System.out.println("無參數(shù)無返回值");};noParameterNoReturn.test();//一個(gè)參數(shù)無返回值OneParameterNoReturn oneParameterNoReturn = (int a) -> {System.out.println("一個(gè)參數(shù)無返回值:" + a);};oneParameterNoReturn.test(10);//多個(gè)參數(shù)無返回值MoreParameterNoReturn moreParameterNoReturn = (int a, int b) -> {System.out.println("多個(gè)參數(shù)無返回值:" + a + "" + b);};moreParameterNoReturn.test(20, 30);//有返回值無參數(shù)NoParameterReturn noParameterReturn = () -> {System.out.println("有返回值無參數(shù)");return 40;};int ret = noParameterReturn.test();System.out.println(ret);//有返回值有一個(gè)參數(shù)OneParameterReturn oneParameterReturn = (int a) -> {System.out.println("有返回值有一個(gè)參數(shù)");return a;};ret = oneParameterReturn.test(50);System.out.println(ret);//有返回值多個(gè)參數(shù)MoreParameterReturn moreParameterReturn = (int a, int b) -> {System.out.println("有返回值多個(gè)參數(shù)");return a + b;};ret = moreParameterReturn.test(60, 70);System.out.println(ret);} }
注:Lambda表達(dá)式只能應(yīng)用于函數(shù)式接口。
??變量捕獲
變量捕獲是指將外部類中的變量復(fù)制到內(nèi)部類中,這樣內(nèi)部類就可以在外部類的作用域之外訪問這些變量。
匿名內(nèi)部類和lambda表達(dá)式都存在變量捕獲:
@FunctionalInterface interface B {void fun(); } public class Test {public static void main(String[] args) {int a = 10;//匿名內(nèi)部類:B b1 = new B() {@Overridepublic void fun() {System.out.println("匿名內(nèi)部類a=" + a);}};b1.fun();//Lambda表達(dá)式:B b2 = () -> {System.out.println("Lambda表達(dá)式a=" + a);};b2.fun();} }
運(yùn)行結(jié)果如下:
需要注意的是:被捕獲的變量要么是被?nal修飾,要么是隱式 final 的(在使用之前沒有被修改):
@FunctionalInterface interface B {void fun(); } public class Test {public static void main(String[] args) {int a = 10;//a = 11;//①//匿名內(nèi)部類:B b1 = new B() {@Overridepublic void fun() {//a = 11;//②System.out.println("匿名內(nèi)部類a=" + a);}};b1.fun();//a = 11;//③} }
在①、②、③任意一處去掉注釋都會(huì)報(bào)錯(cuò):![]()
??Lambda表達(dá)式在集合中的使用
為了能夠讓 Lambda 和 Java 的集合類集更好的一起使用,Java集合中新增了部分接口,以便與 Lambda 表達(dá)式對(duì)接:
接口 新增方法 Collection removeIf()、spliterator()、stream()、parallelStream()、forEach() List replaceAll()、sort()Map getOrDefault()、forEach()、replaceAll()、putIfAbsent()、remove()、replace()、computeIfAbsent()、computeIfPresent()、compute()、merge()?Collection的foreach():
foreach()的部分源碼:
foreach()的應(yīng)用:
public class Test {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(3);list.add(2);list.forEach(s-> System.out.print(s+" "));} }
運(yùn)行結(jié)果:
?List的sort():
sort()的部分源碼:
sort()的應(yīng)用:
class Test2 {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(3);list.add(2);list.sort((str1,str2)->str1-str2);System.out.println(list);}}
運(yùn)行結(jié)果:
?Map的foreach()
foreach()的部分源碼:
foreach()的應(yīng)用:
class Test3 {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("a", 1);map.put("b", 2);map.put("c",3);map.forEach((k,v)->System.out.println(k+"="+v));} }
運(yùn)行結(jié)果: