侧边栏壁纸
  • 累计撰写 2,046 篇文章
  • 累计创建 73 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

Java Lambda 表达式

大猿本猿
2022-01-03 / 319 阅读 / 0 字

一、函数式编程

在数学中,函数就是有输入量输出量的一计方案,也就是” 数据做操作"

面响对象思想强调“必须通过对象的形式来做事情”

函数式思想则尽量忽略面向对象的复杂语法:“强调做什么, 不以什么形式去做”

而我们要学习的L ambda表达式就函数式魂想的体现

二、体验Lambda

/**
 * @description:
 * @author: Liu Tao
 **/

public class FlyableDemo {
    public static void main(String[] args) {
        //调用useFlyable
        //最传统的方式,需要先写一个类实现flyable接口的fly方法
        FlyableImpl fi = new FlyableImpl();
        useFlyable(fi);
        System.out.println("--------");

        //在主方法中调用useFlyable方法
        //匿名内部类
        useFlyable(new Flyable() {
            @Override
            public void fly(String s) {
                System.out.println(s);
                System.out.println("匿名内部类飞");
            }
        });
        System.out.println("--------");

        //Lambda
        useFlyable((String s) -> {
            System.out.println(s);
            System.out.println("lambda飞");
        });

    }

    private static void useFlyable(Flyable f) {
        f.fly("风和日丽,晴空万里");
    }
}

flyable接口:
public interface Flyable {
    void fly(String s);
}

FlyableImpl实现类:
/**
 * @description:
 * @author: Liu Tao
 **/
public class FlyableImpl implements Flyable{
    @Override
    public void fly(String s) {
        System.out.println(s);
        System.out.println("传统方式飞");
    }
}
输出:

风和日丽,晴空万里
传统方式飞
--------
风和日丽,晴空万里
匿名内部类飞
--------
风和日丽,晴空万里
lambda飞

三、lambda表达式的标准格式

image

image

四、Lambda表达式练习

4.1 练习1

Lambda表达式的使用前提 * 有一个接口 * 接口中有且仅有一个抽象方法 练习描述 * 无参无返回值抽象方法的练习 操作步骤 * 定义一个接口(Eatable),里面定义一个抽象方法:void eat(); * 定义一个测试类(EatableDemo),在测试类中提供两个方法 * 一个方法是:useEatable(Eatable e) * 一个方法是主方法,在主方法中调用useEatable方法

//接口
public interface Eatable {
    void eat();
}
//实现类
public class EatableImpl implements Eatable {
    @Override
    public void eat() {
        System.out.println("一天一苹果,医生远离我");
    }
}
//测试类
public class EatableDemo {
    public static void main(String[] args) {
        //在主方法中调用useEatable方法
        Eatable e = new EatableImpl();
        useEatable(e);

        //匿名内部类
        useEatable(new Eatable() {
            @Override
            public void eat() {
                System.out.println("一天一苹果,医生远离我");
            }
        });

        //Lambda表达式
        useEatable(() -> {
            System.out.println("一天一苹果,医生远离我");
        });
    }

    private static void useEatable(Eatable e) {
        e.eat();
    }
}

4.2 练习2

练习描述 * 有参无返回值抽象方法的练习 操作步骤 * 定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s); * 定义一个测试类(FlyableDemo),在测试类中提供两个方法 * 一个方法是:useFlyable(Flyable f) * 一个方法是主方法,在主方法中调用useFlyable方法 * 示例代码

public interface Flyable {
    void fly(String s);
}

public class FlyableDemo {
    public static void main(String[] args) {
        //在主方法中调用useFlyable方法
        //匿名内部类
        useFlyable(new Flyable() {
            @Override
            public void fly(String s) {
                System.out.println(s);
                System.out.println("飞机自驾游");
            }
        });
        System.out.println("--------");

        //Lambda
        useFlyable((String s) -> {
            System.out.println(s);
            System.out.println("飞机自驾游");
        });

    }

    private static void useFlyable(Flyable f) {
        f.fly("风和日丽,晴空万里");
    }
}

4.3 练习3

练习描述 * 有参有返回值抽象方法的练习 操作步骤 * 定义一个接口(Addable),里面定义一个抽象方法:int add(int x,int y); * 定义一个测试类(AddableDemo),在测试类中提供两个方法 * 一个方法是:useAddable(Addable a) * 一个方法是主方法,在主方法中调用useAddable方法 示例代码

ublic interface Addable {
    int add(int x,int y);
}

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

五、Lambda表达式的省略模式

1、参数类型可以省略,但是不能只省略一个,要么全胜率,要么不省略。

image

2、如果参数有且仅有一个,小括号也可以省略。

image

3、如果代码块的语句只有一条,可以省略大括号和分号,如果有return 也要省略掉

image

image

六、Lambda表达式注意事项

image

1、Lambda表达式使用前提:

  • 有一个接口
  • 接口中有且仅有一个抽象方法

2、使用Lambda必须要要有上下文环境,才能推导出Lambda对应的接口

image

image

七、Lambda表达式和匿名内部类的区别

image

接口若有一个以上的方法,只能使用匿名内部类实现,lambda只支持一个接口。

匿名内部类编译后会有单独的$1.class文件,lambda表达式没有。