Lambda表达式

立山  金牌会员 | 2022-12-26 12:16:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 579|帖子 579|积分 1737

函数式思想
尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式去做。
Lambda表达式
就是函数是思想的体现
案例1
这是一段多线程要执行的内容:
  1. public class MyRunnable implements Runnable {
  2.     @Override
  3.     public void run() {
  4.         System.out.println("今天晚上真冷啊");
  5.     }
  6. }
复制代码
这是测试类:
  1. public class Demo {
  2.     public static void main(String[] args) {
  3.         MyRunnable mr = new MyRunnable();
  4.         Thread t = new Thread(mr);
  5.         t.start();        
  6.     }
  7. }
复制代码
运行结果:
  1. 今天晚上真冷啊
复制代码
案例2
测试类(匿名内部类方式):
  1. public class Demo {
  2.     public static void main(String[] args) {
  3.         new Thread(new Runnable() {
  4.             @Override
  5.             public void run() {
  6.                 System.out.println("今天真饿啊");
  7.             }
  8.         }).start();
  9.     }
  10. }
复制代码
运行结果:
  1. 今天真饿啊
复制代码
案例3
测试类(匿名内部类Lambda表达式写法):
  1. public class Demo {
  2.     public static void main(String[] args) {
  3.         new Thread(()->{
  4.             System.out.println("今天要洗澡");
  5.         }).start();
  6.     }
  7. }
复制代码
运行结果:
  1. 今天要洗澡
复制代码
Lambda表达式三要素
组成Lambda表达式的三要素:形式参数,箭头,代码块

  • ()        里面没有内容,可以看成方法形式参数为空
  • ->        指向要做的事情
  • {}        要执行的代码
格式
格式:(形式参数) -> {代码块}

  • 形式参数:如果有多个形式参数,参数之间用逗号隔开;如果没有就空着
使用前提
Lambda表达式的使用前提

  • 有一个接口
  • 接口中有,且只有一个抽象方法
  • 必须有上下文环境,才能推导出Lambda表达式对应的接口
Lambda表达式的省略


  • 只有一个形式参数时,参数类型可以省略;()也可以省略
  • 参数类型可以省略,但多个参数时,不能只省略某一个
  • 如果{}中只有一条不带return的语句时,句末的分号和{}都可以省略
  • 如果{}中只有一条带return的语句时,句末的分号和{}都可以省 略,return也可以省略
Lambda表达式和匿名内部类的区别

  • 所需类型不同


  • 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
  • Lambda表达式:只能是接口

  • 使用限制不同


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

  • 实现原理不同


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表