JAVA Lambda表达式

 

1. Lambda表达式

1.1 体验Lambda表达式

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

而我们要学习的Lambda表达式就是函数式思想的体现

 

复制代码
 1 /*
 2 案例需求
 3         启动一个线程,在控制台输出一句话:多线程程序启动了
 4 */
 5 public class myLambda {
 6     public static void main(String[] args) {
 7        /* 实现方式一:
 8         1.定义一个类MyRunnable实现Runnable接口,重写run()方法
 9         2.创建MyRunnable类的对象
10         3.创建Thread类的对象,把MyRunnable的对象作为构造参数传递
11         4.启动线
12         */
13        //创建MyRunnable对象
14         MyRunnable mr = new MyRunnable();
15 
16         //创建多线程对象,把Runnable的实现类对象mr传进去,并启动线程
17         new Thread(mr).start();
18 
19 
20         //实现方式二:
21         //匿名内部类的方式改进
22         new Thread(new Runnable() {
23             @Override
24             public void run() {
25                 System.out.println("多线程程序启动了");
26             }
27         }).start();
28 
29 
30         //实现方式三:
31         //Lambda表达式的方式改进
32         new Thread(()->{
33             System.out.println("多线程程序启动了");
34         }).start();
35     }
36 }
复制代码
1 Runnable的实现类对象:
2 public class MyRunnable implements Runnable{//继承Runnable接口
3     //重写run方法
4     @Override
5     public void run() {
6         System.out.println("多线程程序启动了");
7     }
8 }

 

1.2 Lambda表达式的标准格式

1 格式:
2 
3     (形式参数) -> {代码块}

 

形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可

->:由英文中画线和大于符号组成,固定写法。代表指向动作

代码块:是我们具体要做的事情,也就是以前我们写的方法体内容

组成Lambda表达式的三要素:形式参数,箭头,代码块

  

1.3 Lambda表达式练习

Lambda表达式的使用前提
(1)有一个接口

(2)接口中有且仅有一个抽象方法

练习描述:

无参无返回值抽象方法的练习

操作步骤:
(1)定义一个接口(Eatable),里面定义一个抽象方法:void eat();

(2)定义一个测试类(EatableDemo),在测试类中提供两个方法:

一个方法是:useEatable(Eatable e)

一个方法是主方法,在主方法中调用useEatable方法

接口:

1 public interface Eatable {
2     void eat();
3 }

 

接口实现类对象:

1 public class EatableImpl implements Eatable{
2     @Override
3     public void eat() {
4         System.out.println("吃苹果了!");
5     }
6 }

 

测试类:

复制代码
 1 public class EatableDemo {
 2     public static void main(String[] args) {
 3 
 4         //方式一:创建接口实现类对象,并把这个接口实现类对象传到useEatable()的参数里
 5         EatableImpl eai = new EatableImpl();
 6         useEatable(eai);
 7 
 8         //方式二:匿名内部类
 9         useEatable(new Eatable() {
10             @Override
11             public void eat() {
12                 System.out.println("吃苹果了!");
13             }
14         });
15 
16 
17         //方式三:Lambda表达式
18         useEatable(()->{
19             System.out.println("吃苹果了!");
20         } );
21     }
22 
23 
24     private static void useEatable(Eatable e) {
25         e.eat();
26     }
27 }
复制代码

 

1.4 Lambda表达式练习2

练习描述:
有参无返回值抽象方法的练习

操作步骤:
定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s);
定义一个测试类(FlyableDemo),在测试类中提供两个方法
一个方法是:useFlyable(Flyable f)
一个方法是主方法,在主方法中调用useFlyable方法

接口:

1 接口:
2 public interface Flyable {
3     void fly(String s);
4 }

 

 

测试类:

复制代码
 1 public class FlyableDemo {
 2     public static void main(String[] args) {
 3         //方式一:匿名内部类
 4         useFlyable(new Flyable() {
 5             @Override
 6             public void fly(String s) {
 7                 System.out.println(s);
 8                 System.out.println("一个筋斗十万八千里");
 9             }
10         });
11 
12 
13         System.out.println("--------");
14 
15 
16         //方式二:Lambda表达式
17         useFlyable((String s)->{
18             System.out.println(s);
19             System.out.println("一个筋斗十万八千里");
20         });
21     }
22 
23     private static void useFlyable(Flyable f) {
24         f.fly("风和日丽");
25     }
26 
27 }
复制代码

 

1.5 Lambda表达式练习3


练习描述:
有参有返回值抽象方法的练习

操作步骤:
定义一个接口(Addable),里面定义一个抽象方法:int add(int x,int y);
定义一个测试类(AddableDemo),在测试类中提供两个方法:
一个方法是:useAddable(Addable a)
一个方法是主方法,在主方法中调用useAddable方法

接口:

1 public interface Addable {
2     int add(int x,int y);
3 }

 

测试类:

复制代码
 1 测试类:
 2 public class AddableDemo {
 3     public static void main(String[] args) {
 4 
 5         //匿名内部类:
 6         useAddable(new Addable() {
 7             @Override
 8             public int add(int x, int y) {
 9                 return x+y;
10             }
11         });
12 
13         System.out.println("--------");
14 
15         //Lambda表达式:
16         useAddable((int x,int y)->{
17             return  x+y;
18         });
19     }
20 
21     private static void useAddable(Addable a) {
22         int sum = a.add(10, 20);
23         System.out.println("和为:"+sum);
24     }
25 }
复制代码

 

1.6 Lambda表达式的省略模式

省略的规则:

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

接口1:

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

接口2:

1 public interface Addable {
2     int add(int x,int y);
3 }

测试类:

复制代码
 1 public class LambdaDemo {
 2     public static void main(String[] args) {
 3 //参数类型可以省略,只有一条语句时省略大括号和语句后面的分号,如果有return,return也要省略掉
 4         //如果参数有且仅有一个,那么小括号可以省略
 5         useFlyable((s ->System.out.println(s)));
 6 
 7         System.out.println("---------");
 8 
 9         useAddable((x,y)->x+y);
10     }
11 
12     private static void useAddable(Addable a) {
13         int sum = a.add(10, 20);
14         System.out.println("两数之和为:"+sum);
15     }
16 
17     private static void useFlyable(Flyable f) {
18         f.fly("风和日丽,晴空万里");
19     }
20 }
复制代码

 

1.7 Lambda表达式的注意事项

 

(1)使用Lambda必须要有接口(抽象类、具体类都不行),并且要求接口中有且仅有一个抽象方法

(2)必须有上下文环境,才能推导出Lambda对应的接口

根据局部变量的赋值得知Lambda对应的接口  

1 Runnable r = () -> System.out.println("Lambda表达式");

根据调用方法的参数得知Lambda对应的接口

1 new Thread(() -> System.out.println("Lambda表达式")).start();

 

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


所需类型不同:

匿名内部类:可以是接口,也可以是抽象类,还可以是具体类

Lambda表达式:只能是接口

使用限制不同:
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类

如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

实现原理不同:

匿名内部类:编译之后,产生一个单独的.class字节码文件

Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成

 

posted @   忱康  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示