/*app 冗餘的 Lambda 場景dom */ide public class Demo12 {函數 public static void main(String[] args) {this //Lambda表達式spa printString(s-> System.out.println(s));.net }對象 public static void printString(MyInter1 myInter1){繼承 myInter1.print("Hello,World!");接口 } @FunctionalInterface interface MyInter1{ public void print(String str); } |
分析: 其中 printString 方法只管調用 MyInter1 接口的 print 方法,而並無論 print 方法的具體實現邏輯會將字符串輸出到什麼地方去。而 main 方法經過 Lambda 表達式指定了函數式接口MyInter1 的具體操做方案爲:拿到 String(類型能夠推導,因此可省略)數據後,在控制檯輸出它。
public class Demo12 { public static void main(String[] args) { //Lambda表達式 // printString(s-> System.out.println(s)); printString(System.out::println); } public static void printString(MyInter1 myInter1){ myInter1.print("Hello,World!"); } } @FunctionalInterface interface MyInter1{ public void print(String str); } |
請注意其中的雙冒號::寫法,這被稱爲「方法引用」,而雙冒號是一種新的語法
若是使用 Lambda,那麼根據「可推導就是省略」的原則,無需指定參數類型,也無需指定重載形式---它們都被自動推導,而若是使用方法引用,也一樣能夠根據上下文進行推導。
//對象名 引用成員方法的引用 public class Test7 { public static void main(String[] args) { String str="LIWENJIE"; //skips(()->str.toLowerCase()); //轉換爲小寫 skips(str::toLowerCase); } public static void skips(Supplier<String>supplier){ String ss=supplier.get(); System.out.println(ss); } }
|
//經過類名靜態方法的引用 public class Test8 { public static void main(String[] args) { display(Math::random); display(()->Math.random()); } public static void display(Supplier<Double>set) { double aa=set.get(); System.out.println(aa); } }
|
若是存在繼承關係,當 Lambda 中須要出現 super 調用時,也可使用方法引用進行替代。
首先定義一個函數式接口
//Super引用成員方法 public class Test9 { public static void main(String[] args) { //建立當前類的對象 F1 ff=new F1(); ff.apple(); }
} interface inface1{ void meth(); } //建立父類 class F1{ public void apple(){ System.out.println("李文傑"); } } //建立子類 class S1 extends F1{ public void apple() { System.out.println("天水市"); } //定義方法 public void apple1(inface1 inface11){ inface11.meth(); } //引用當前類父類的方法 public void apple2(){ //引用當前類父類的方法 apple1(super::apple); //引用當前類的方法 apple1(this::apple); }
} |
//this引用成員方法 public class Test10 { public static void main(String[] args) { Myshe ss=new Myshe(); ss.method(); } } interface my{ void test(); } class Myshe{ public void meth(my ss){ ss.test(); } public void skip(){ System.out.println("我是成員方法"); } //引用成員方法 public void method(){ //Lambda表達式的寫法 meth(()->this.skip()); //方法的引用 meth(this::skip); } } |