练习:
一个方法是useFlyable(Flyable f)
主方法,在主方法中调用useflyable方法
package Demo16; public interface Flyable { void fly(String s ); }
package Demo16; import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput; public class FlyableDemo { public static void main(String[] args) { useFlyable(new Flyable() { @Override public void fly(String s) { System.out.println(s); System.out.println("飞机自驾游"); } }); System.out.println("----------------"); useFlyable( (String s ) -> { System.out.println(s); System.out.println("飞机自驾游"); }); } private static void useFlyable(Flyable f){ f.fly("风和日丽,晴空万里"); } }
练习2
一个方法是:useAddable(Addable)
一个主方法是,在主方法中调用useAddable方法
package Demo17; public interface Addable { int add(int x ,int y); }
package Demo17; public class AddableDemo { public static void main(String[] args) { //在主方法中调用useAddable方法 useAddable( (int x ,int y ) ->{ return x+y;//简化重写方法可以看做 }); } private static void useAddable(Addable a){ int sum = a.add(10, 20); System.out.println(sum); } }
省略规则:
package Demo17; public class AddableDemo { public static void main(String[] args) { //在主方法中调用useAddable方法 // useAddable( (int x ,int y ) ->{ // return x+y;//简化重写方法可以看做 //参数的类型可以省略 // useAddable( (x,y) -> { // return x+y; // }); // //类型虽然可以省略,但是有多个参数的情况下不能只省略一个 // useFlyable( (String s ) -> { // System.out.println(s); // });//如果参数有且仅有一个,小括号可以省略 // useFlyable( s -> { // System.out.println(s); // }); //如果代码块的语句只有一条,可以省略大括号和分号 useFlyable( s -> System.out.println(s)); //useAddable( (x,y) -> return x+y);//如果有return,return也要省略,只针对代码块只有一条的情况 useAddable( (x,y) -> x+y); } private static void useAddable(Addable a){ int sum = a.add(10, 20); System.out.println(sum); } private static void useFlyable(Flyable f){ f.fly("风和日丽,晴空万里"); } }
根据局部变量的赋值得知lambda对应的接口:Runnable r = () -> System.out.println("lambda表达式");
根据调用方法的参数得知lambda对应的接口:new Thread( () -> System.out.println("lambda表达式")).start();
package Demo18; public class LambdaDemo { public static void main(String[] args) { // useInter( () -> { // System.out.println("好好学习,天天向上"); // }); //使用Lambda必须要有接口,并且接口有且仅有一个抽象方法 useInter( () -> System.out.println("好好学习,天天向上")); //必须要有上下文华宁,才能推导出lambda对应接口 // new Thread(new Runnable() { // @Override // public void run() { // System.out.println("匿名内部类"); // } // }); Runnable r = () -> System.out.println("lambda表达式"); new Thread(r).start(); new Thread( () -> System.out.println("lambda表达式")).start(); } private static void useInter(Inter i ){ i.show(); } }
所需类型不同:
使用限制不同:
实现原理不同:
package Demo19; public class LambdaDemo { public static void main(String[] args) { ////匿名内部类,接口可以使用多个抽象方法 // useInter(new Inter() { // @Override // public void show1() { // System.out.println("接口"); // } // public void show2() { // System.out.println("接口"); // } // }); // useAnimal(new Animal() { // @Override // public void method() { // System.out.println("抽象类"); // } // }); // useStudent(new Student(){ // @Override // public void study(){ // System.out.println("具体类"); // } // }); //lambda,接口有且仅有一个抽象方法 // useInter( () -> System.out.println("接口")); //useAnimal(() -> System.out.println("接口")); // useStudent(() -> System.out.println("具体类")); //使用lambda的地方参数必须是一个接口(有且只有一个) } private static void useStudent(Student s ){s.study();} private static void useAnimal(Animal a ){a.method();} private static void useInter(Inter i ){i.show1();i.show2();} }