当前位置: 首页 > news >正文

Java学习笔记40——Lambda表达式

Lambda表达式

  • Lambda表达式
    • 函数式编程思想概述
    • Lambda表达式的标准格式
    • Lambda表达式练习
      • 练习1
      • 练习2
      • 练习3
    • Lambda表达式的省略模式
    • Lambda表达式的注意事项
    • Lambda表达式与接口的区别

Lambda表达式

函数式编程思想概述

面向对象思想强调“必须通过对象的形式做事”
在函数式思想中尽量忽略面向对象的复杂语法:“强调做什么,而不是什么形式做”

Lambda表达式的标准格式

  • ()里面为空,可以看成是方法的形参为空
  • -> 用箭头指向后面要做的事
  • {} 包含一段代码,称为代码块,可以看成是方法体中的内容
    三要素:形式参数、箭头、代码块
    (形式参数)->{代码块}

Lambda表达式练习

Lambda表达式使用的前提条件

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

练习1

  • 定义一个接口(Eatable),里面定义一个抽象方法: void eat()
  • 定义一个测试类(EatableDemo),在测试类中提供两个方法
    • 一个 方法是:useEatable(Eatable e)
    • 一个方法是主方法,在主方法中调用useEatable方法

创建接口

public interface Eatable {void eat();
}

创建实现类

public class EatableImpl implements Eatable{@Overridepublic void eat(){System.out.println("CC吃我的屎!");}
}

创建测试类

public class EatableDemo {public static void main(String[] args){//实现类Eatable e=new EatableImpl();useEatable(e);//匿名内部类useEatable(new Eatable() {@Overridepublic void eat() {System.out.println("CC吃我的屁!");}});//Lambda表达式useEatable(()->{System.out.println("CC吃我的大便!");});}private static void useEatable(Eatable e){e.eat();}
}

练习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(new Flyable() {@Overridepublic void fly(String s) {System.out.println(s);System.out.println("把CC屁股打烂!");}});//LambdauseFlyable((String s)->{System.out.println(s);System.out.println("把CC活打死!");});}private static void useFlyable(Flyable f){f.fly("飞飞飞");}
}

练习3

  • 定义一个Addable接口,里面定义一个抽象方法:int add(int x,int y)
  • 定义一个AddableDemo测试类包含
    • useAddable(Addable a)
    • 主方法调用useAddable

创建接口

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

测试类

public class AddableDemo {public static void main(String[] args) {useAddable((int x,int y)->{return x+y;});}private static void useAddable(Addable a){int res=a.add(10,20);System.out.println(res);}
}

Lambda表达式的省略模式

  • 参数的类型可以省略,有多个不能只省略一个
  • 如果参数有且仅有一个,小括号可以省略
  • 如果代码块只有一行,可以省略大括号和分号(有return也需要省略)
public class LambdaDemo {public static void main(String[] args) {
//        useAddable((int x,int y)->{
//            return x+y;
//        });//参数的类型可以省略,不能只省略一个useAddable((x, y)->{return x+y;});//如果参数有且仅有一个,小括号可以省略useFlyable(s->{System.out.println(s);System.out.println("把CC活打死!");});//如果代码块只有一行,可以省略大括号和分号(有return也需要省略)useFlyable(s-> System.out.println(s));}public static void useFlyable(Flyable f){f.fly("飞飞飞");}private static void useAddable(Addable a){int res=a.add(10,20);System.out.println(res);}
}

Lambda表达式的注意事项

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

Lambda表达式与接口的区别

所需类型不同

  • 匿名内部类:可以是接口也可以是抽象类,还可以是具体类
  • Lambda表达式:只能是接口
    使用限制不同
  • 如果接口中有且只有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
  • 如果接口中多于一个抽象方法,只能用匿名内部类,不能用Lambda表达式
    实现原理不同
  • 匿名内部类编译后,产生一个单独的.class字节码文件
  • Lambda编译之后没有单独的.class字节码文件。对用的字节码会在运行的时候动态生成
http://www.lryc.cn/news/171382.html

相关文章:

  • 【考研数学】线性代数第五章 —— 特征值和特征向量(3,矩阵对角化理论)
  • 【计算机网络】IP数据报首部格式、最大传输单元MTU、最大分段大小MSS
  • shell脚本之文件读写
  • SAP 刷新Fiori Apps缓存的方法(解决修改CDS后Fiori无法重载新配置)
  • 如何在 Excel 中计算日期之间的天数
  • Java高级-注解
  • wabp.m 代码注释(便于算法快速理解)
  • 数据库数据恢复-SQL SERVER数据库文件损坏的故障表现数据恢复方案
  • flink中cpu消耗的大户-序列化和反序列化
  • 使用 K 均值聚类进行颜色分割
  • Redis 哈希表操作实战(全)
  • element table合并行或列 span-method
  • 【操作系统笔记】内存分配
  • Web 整合
  • hasOwnProperty 方法解析
  • 使用 nohup 运行 Python 脚本
  • Django:五、登录界面实现动态图片验证码
  • GPT,GPT-2,GPT-3,InstructGPT的进化之路
  • firefox_dev_linux下载安装配置(部分系统自带包请看结尾)
  • vim缓存-交换文件
  • Hive 优化建议与策略
  • CentOS 7.5 centos failed to load selinux policy 错误解决方法
  • 注入之SQLMAP(工具注入)
  • Linux学习资源Index
  • 什么是SVG(可缩放矢量图形)?它与普通图像格式有何不同?
  • 求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows
  • React TypeScript 定义组件的各种方式
  • 互联网摸鱼日报(2023-09-20)
  • AWS入列CNCF基金会
  • 岭回归与LASSO回归:解析两大经典线性回归方法