java复习笔记--Lambda表达式 雨点打透心脏的1/2处 2021-06-24 13:58 341阅读 0赞 ### Lambda表达式 ### * * 函数式编程思想概述 * Lambda表达式的标准格式 * Lambda表达式的使用前提 * 体验Lambda表达式 * 无参无返回值抽象方法的练习 * 有参无返回值抽象方法的练习 * 有参有返回值抽象方法的练习 * Lambda表达式的省略模式 * * 省略的规则 * Lambda表达式的注意事项 * Lambda表达式和匿名内部类的区别 ## 函数式编程思想概述 ## 函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做” 而我们要学习的Lambda表达式就是函数式思想的体现 ## Lambda表达式的标准格式 ## 格式: (形式参数) -> { 代码块} 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可 ->:由英文中画线和大于符号组成,固定写法。代表指向动作 代码块:是我们具体要做的事情,也就是以前我们写的方法体内容 ## Lambda表达式的使用前提 ## 有一个接口 接口中有且仅有一个抽象方法 ## 体验Lambda表达式 ## 启动一个线程 **实现方式一** 实现步骤 定义一个类MyRunnable实现Runnable接口,重写run()方法 创建MyRunnable类的对象 创建Thread类的对象,把MyRunnable的对象作为构造参数传递 启动线程 public class myrunnable implements Runnable{ @Override public void run() { System.out.println("实现接口的方式"); } } public class myrunnabletest { public static void main(String[] args) { myrunnable my = new myrunnable(); Thread t1=new Thread(my); t1.start(); //实现接口的方式 } } **实现方式二** 匿名内部类 public class myrunnabletest { public static void main(String[] args) { Thread t1=new Thread(new Runnable() { @Override public void run() { System.out.println("匿名内部类的方式"); } }); t1.start(); //匿名内部类的方式 } } **实现方式三** Lambda表达式 public class myrunnabletest { public static void main(String[] args) { Thread t1=new Thread(()->{ System.out.println("Lambda表达式"); } ); t1.start(); //Lambda表达式 } } ## 无参无返回值抽象方法的练习 ## public class flydemo { public static void main(String[] args) { //1 flyable f=new flyImpl(); useflyable(f); //2 useflyable(new flyable() { @Override public void fly() { System.out.println("我会飞"); } }); //3 useflyable(()->{ System.out.println("我会飞"); }); } public static void useflyable(flyable f){ f.fly(); } } ## 有参无返回值抽象方法的练习 ## public class flydemo { public static void main(String[] args) { //1 flyable f=new flyImpl(); useflyable(f); //2 useflyable(new flyable() { @Override public void fly(String name, String o) { System.out.println("我是"+name+"会飞,飞的比"+o+"快"); } }); //3 useflyable((String name,String o)->{ System.out.println("我是"+name+"会飞,飞的比"+o+"快"); }); } public static void useflyable(flyable f){ f.fly("dyk","飞机"); } } ## 有参有返回值抽象方法的练习 ## public class flydemo { public static void main(String[] args) { //1 flyable f=new flyImpl(); useflyable(f); //2 useflyable(new flyable() { @Override public int add(int a, int b) { return a+b; } }); //3 useflyable((int a,int b)->{ return a+b; }); } public static void useflyable(flyable f){ int sum=f.add(1,2); System.out.println("和为:"+sum); } } ## Lambda表达式的省略模式 ## ### 省略的规则 ### 参数类型可以省略。但是有多个参数的情况下,不能只省略一个 如果参数有且仅有一个,那么小括号可以省略 如果代码块的语句只有一条,可以省略大括号和分号,如果有return,return也要省略掉 参数类型可以省略。但是有多个参数的情况下,不能只省略一个 public class flydemo { public static void main(String[] args) { //参数的类型可以省略 useflyable(( a,b)->{ return a+b; }); } public static void useflyable(flyable f){ int sum=f.add(1,2); System.out.println("和为:"+sum); } } 如果只省略一个会报错 如果参数有且仅有一个,那么小括号可以省略 public class flydemo { public static void main(String[] args) { //如果参数有且仅有一个,那么小括号可以省略 useflyable(a->{ return a+2; }); } public static void useflyable(flyable f){ int sum=f.add(1); System.out.println("和为:"+sum); } } 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字 public class flydemo { public static void main(String[] args) { //3 useflyable(a->a+2); } public static void useflyable(flyable f){ int sum=f.add(1); System.out.println("和为:"+sum); } } ## Lambda表达式的注意事项 ## 使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法 必须有上下文环境,才能推导出Lambda对应的接口 根据局部变量的赋值得知Lambda对应的接口 Runnable r = () -> System.out.println("Lambda表达式"); 根据调用方法的参数得知Lambda对应的接口 new Thread(() -> System.out.println("Lambda表达式")).start(); ## Lambda表达式和匿名内部类的区别 ## 所需类型不同 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 Lambda表达式:只能是接口 使用限制不同 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式 实现原理不同 匿名内部类:编译之后,产生一个单独的.class字节码文件 Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
还没有评论,来说两句吧...