当前位置 博文首页 > zhouyu的博客:Lambda笔记

    zhouyu的博客:Lambda笔记

    作者:[db:作者] 时间:2021-09-07 19:07

    1.函数式编程思想概述

    强调做什么,而不是以什么形式去做
    

    2.Lambda表达式的标准格式

    格式:(形式参数) -> {代码块}
    形式参数:如果有多个参数,参数之间用逗号隔开,如果没有参数,留空即可
    ->:由英文中画线和大于符号组成,固定写法。代表指向动作
    代码块:是具体要做的事情,也就是方法体内容
    

    3.Lambda表达式练习

    Lambda表达式使用前提:
    	有一个接口
    	接口中有且仅有一个抽象方法
    

    练习1:

    	定义一个接口(Eatable),里面定义一个抽象方法:void eat();
    
    package lambda;
    
    public interface Eatable {
        void eat();
    }
    
    
    	定义一个测试类(EatableDemo),在测试类中提供两个方法
    		一个方法是:useEatable(Eatable e)
    		一个方法是主方法,在主方法中调用useEatable方法
    
    package lambda;
    
    public class EatableDemo {
        public static void main(String[] args) {
            //匿名内部类
            useEatable(new Eatable() {
                @Override
                public void eat() {
                    System.out.println("1");
                }
            });
    
            //Lambda表达式
            useEatable(() ->{
                System.out.println("1");
            });
        }
    
        private static void useEatable(Eatable e){
            e.eat();
        }
    }
    
    

    练习2:

    	定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s);
    
    package lambda;
    
    public interface Flyable {
        void fly(String s);
    }
    
    
    	定义一个测试类(FlyableDemo),在测试类中提供两个方法
    		一个方法是:useFlyable(Flyable f)
    		一个方法是主方法,在主方法中调用useFlyable方法
    
    package lambda;
    
    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("123");
                }
            });
            //Lambda表达式
            useFlyable((String s)->{
                System.out.println(s);
                System.out.println("123");
            });
    
            useFlyable(System.out::println);
        }
    
        private static void useFlyable(Flyable f){
            f.fly("你好");
        }
    }
    
    

    练习3:

    	定义一个接口(Addable),里面定义一个抽象方法:int add(int x,int y);
    
    package lambda;
    
    public interface Addable {
        int add(int x,int y);
    }
    
    
    	定义一个测试类(AddableDemo),在测试类中提供两个方法
    		一个方法是:useAddable(Addable a)
    		一个方法是主方法,在主方法中调用useAddable方法
    
    package lambda;
    
    public class AddableDemo {
        public static void main(String[] args) {
            useAddable((int x,int y) -> {
                return x + y;
            });
        }
    
        private static void useAddable(Addable a){
            int sum = a.add(10, 20);
            System.out.println(sum);
        }
    }
    
    

    4.Lanbda表达式的省略模式

    参数类型可以省略,但是有多个参数的情况下,不能只省略一个
    如果参数有且仅有一个,那么小括号可以省略
    如果代码块的语句只有一条,可以省略大括号和分号,甚至是return
    

    5.Lambda表达式的注意事项

    使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法
    必须有上下文环境,才能推导出Lambda对应的接口
    	根据局部变量的赋值得知Lambda对应的接口:Runnable r = () -> System.out.println("Lambda表达式");
    	根据调用方法的参数得知Lambda对应的接口:new Thread(() -> System.out.println("Lambda表达式")).start();
    

    6.Lambda表达式和匿名内部类的区别

    所需类型不同:
    	匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
    	Lambda表达式:只能是接口
    使用限制不同:
    	如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
    	如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
    实现原理不同:
    	匿名内部类:编译后,产生一个单独的.class字节码文件
    	Lambda表达式:编译后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
    
    cs
    上一篇:没有了
    下一篇:没有了