Lambda表达式的基础用法

Lambda表达式的基础用法

  • 需要一个接口
  • 接口中有且只有一个抽象方法
  • 必须有上下文环境(赋值或者是对应参数)

无参无返回值

接口:

public interface Person {
    void eat();
}

测试类:

public class LambdaDemo {
    public static void main(String[] args) {
        /*
        * 三种方式实现接口:
        *
        * 1.新建一个实现类实现接口
        * 2.匿名内部类实现接口
        * 3.lambda表达式
        * */

        // 2.匿名内部类实现
        useEat(new Person() {
            @Override
            public void eat() {
                System.out.println("吃");
            }
        });

        // 3.lambda表达式
        /*
        * 写法和js的ES6中的箭头函数类似
        * 这次写的是无参方法
        * */
        useEat(() -> {
            System.out.println("吃");
        });
    }
    // 定义一个方法,参数为这个接口的多态对象
    public static void useEat(Person person){
        // 调用接口中的方法
        person.eat();
    }
}

带参无返回值

接口:

public interface Person {
    void sing(String song);
}

测试类:

public class Lambda {
    public static void main(String[] args) {
        // 匿名内部类
        useSing(new Person() {
            @Override
            public void sing(String song) {
                System.out.println(song);
            }
        });

        // lambda表达式
        useSing((String s) -> {
            System.out.println(s);
        });
    }
    // 定义一个方法
    public static void useSing(Person person){
        person.sing("天下");
    }
}

带参带返回值

接口:

public interface Math {
    int add(int x,int y);
}

测试类:

public class Lambda {
    public static void main(String[] args) {
        // lambda表达式
        UseAdd((int x,int y) -> {
           return x + y ;
        });
    }

    public static void UseAdd(Math m) {
        System.out.println(m.add(1, 2));
    }
}

lambda的省略

  1. 可以省略数据类型
  2. 如果只有一个参数,()可以省略
  3. 代码块只有一条{}可以省略
  4. 在3的基础上如果有return需要省略return

接口:

public interface Person {
    String sing(String song1,String song2);
}

测试类:

public class Lambda {
    public static void main(String[] args) {
        // 使用lambda实现
        // 1.可以省略数据类型,
        // 但是多个参数时,只能全都省,或者全都不省
        useSing((s1,s2) -> {
            return new String(
                    new StringBuilder()
                            .append(s1)
                            .append(s2));
        });

        // 2.如果只有一个参数,()可以省略
        // 3.代码块只有一条{}可以省略
        // 4.在3的基础上如果有return需要省略return

        // 上述代码可以改成
        useSing((s1,s2) -> new String(new StringBuilder().append(s1).append(s2)));
    }
    // 定义一个方法
    public static void useSing(Person person){
        // 调用接口中的方法
        String sing = person.sing("歌曲1","歌曲2");
        System.out.println(sing);
    }
}

lambda和匿名内部类实现原理的区别

  • 匿名内部类相比lambda会额外产生.class文件
  • lambda表达式的字节码文件是在运行时动态的生成
上一篇:ctf堆溢出


下一篇:对象持有-容器