/*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); } } |