Lambda表達式 Lambda表達式理解 Lambda表達式是Jdk 8 開始新增的一種語法形式;作用:用於簡化匿名內部類的代碼寫法 註意:Lambda表達式只能簡化函數式介面的匿名內部類!!! 什麼是函數式介面? 有且僅有一個抽象方法的介面。 註意:大部分函數式介面,上面可能會有一個@Funct ...
Lambda表達式
Lambda表達式理解
-
Lambda表達式是Jdk 8 開始新增的一種語法形式;作用:用於簡化匿名內部類的代碼寫法
註意:Lambda表達式只能簡化函數式介面的匿名內部類!!!
什麼是函數式介面?
-
有且僅有一個抽象方法的介面。
-
註意:大部分函數式介面,上面可能會有一個@FunctionalInterface的註解,有該註解的介面就必定是函數式介面。
Lambda表達式的省略寫法(進一步簡化Lambda表達式的寫法)
-
參數類型可以省略不寫。
-
l如果只有一個參數,參數類型可以省略,同時()也可以省略。
-
l如果Lambda表達式中的方法體代碼只有一行代碼,可以省略大括弧不寫,同時要省略分號!此時,如果這行代碼是return語句,也必須去掉return關鍵字不寫。
上代碼
基於無參無返回值,無參有返回值,有參無返回值,有參有返回值
package com.itheima.yaoyao; import java.util.Random; public class LambdaDemo2 { public static void main(String[] args) { //基於匿名內部類調用useInterOne:分析有一個InterOne介面【快速創建介面的實現類對象】 怎麼做! useInterOne(new InterOne() { @Override public void methodOne() { System.out.println("無參無返匿名內部類調用"); } }); //基於Lambda表達式調用useInterOne:分析(1)必須要傳遞InterOne介面實現類對象【省略】(2)必須要實現methodOne抽象方法【省略】 //methodOne方法的邏輯【不能!】傳遞methodOne方法的邏輯(剩餘的事情由Java來做) 【基於Lambda表達式來做methodOne方法的邏輯載體】 useInterOne(()->{System.out.println("lambda表達式表示無參無返");}); //基於匿名內部類調用useInterTwo useInterTwo(new InterTwo() { @Override public Integer methodTwo() { return 100; } }); //基於Lambda表達式調用useInterTwo:分析(1)必須要傳遞InterTwo介面實現類對象【省略】(2)必須要實現methodTwo抽象方法【省略】 //methodTwo方法的邏輯【不能!】傳遞methodTwo方法的邏輯(剩餘的事情由Java來做) 【基於Lambda表達式來做methodTwo方法的邏輯載體】 //如果Lambda實現的方法需要返回值就要在{}中return回滿足要求的結果 useInterTwo(()->{ return new Random().nextInt(100); }); //基於匿名內部類調用useInterThree useInterThree(new InterThree() { @Override public void methodThree(String name, String food) { System.out.println(name+"愛喝"+food); } }); //基於Lambda表達式調用useInterThree:分析(1)必須要傳遞InterThree介面實現類對象【省略】(2)必須要實現methodThree抽象方法【省略】 //methodThree方法的邏輯【不能!】傳遞methodThree方法的邏輯(剩餘的事情由Java來做) 【基於Lambda表達式來做methodThree方法的邏輯載體】 //如果Lambda表達式作為方法的載體,方法聲明瞭形式參數,在Lambda的()中也要聲明同樣形式參數 useInterThree( (String name,String food) ->{ System.out.println(name + "愛吃"+"小雞燉蘑菇"); }); //基於匿名內部類調用useInterFour useInterFour(new InterFour() { @Override public String methodFour(String foodOne, String foodTwo) { return foodOne+"燉"+foodTwo; } }); //基於Lambda調用 useInterFour((String foodOne, String foodTwo) ->{return foodOne + "炒"+ foodTwo ;}); } //編寫4個方法分別將四個介面作為方法的參數【傳遞四個介面中不同類型的方法Lambda表達式】 //在編寫方法的時候並不明確方法的具體邏輯是什麼 【多態:傳遞進來的實現類的實現邏輯是什麼,這裡就執行什麼邏輯】 public static void useInterOne(InterOne interOne) { interOne.methodOne(); } public static void useInterTwo(InterTwo interTwo) { Integer result = interTwo.methodTwo(); System.out.println("useInterTwo Result:" + result); } public static void useInterThree(InterThree interThree) { interThree.methodThree("張二狗", "西紅柿炒洋柿子"); } public static void useInterFour(InterFour interFour) { String result = interFour.methodFour("大蔥", "笨雞蛋"); System.out.println("useInterFour Result:" + result); } } @FunctionalInterface interface InterOne { //無參無返回值的抽象方法 void methodOne(); } @FunctionalInterface interface InterTwo { //無參有返回值的抽象方法 Integer methodTwo(); } @FunctionalInterface interface InterThree { //有參無返回值的抽象方法 void methodThree(String name, String food); } @FunctionalInterface interface InterFour { //有參有返回值的抽象方法 String methodFour(String foodOne, String foodTwo); }