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

Lambda表达式详解(包含笔记和对应练习)

1、Lambda表达式

(1)lambda表达式及注意事项

———1、Lambda表达式实现函数式接口
//采用匿名内部类的书写方法 //new了{}这个匿名内部类,实现了Comparator<Integer>()这个接口 Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer o1,Integer o2){ return o1-o2;//按照升序排序 // return o2-o1;//按照降序排序 } }); //采用Lambda表达式进行简化 Arrays.sort(arr, (Integer o1,Integer o2)->{//方法的形参 return o1-o2;//方法体 } );

函数式编程

函数式编程是一种思想特点。

面向对象:先找对象,让对象做事情。

函数式编程思想,忽略面向对象复杂语法强调做什么,而不是谁去做

下面要学习的Lambda表达式就是函数式思想的体现。

Lambda表达式的标准格式:

()-> {

}

  • () 对应着方法的形参

  • ->固定格式

  • {}对应着方法的方法体

注意点:

  • Lambda表达式可以用来简化匿名内部类的书写

  • Lambda表达式只能简化函数式接口的匿名内部类的写法

    有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加@Functionallnterface注解,该注解告诉编译器,检查该接口必须是函数式接口,否则编译器就会报错。

    • 函数式接口:

Lambda表达式常见的三种方式:

  • 将Lambda表达式赋值给函数式接口类型的变量。

  • 将Lambda表达式作为函数式接口类型的参数传给某个方法。

  • 使用函数式接口对Lambda表达式进行强制转换。

Lambda表达式的执行规则

Lambda 表达式本身只是一个 “方法定义”,只有当你调用它对应的抽象方法时,Lambda 里的代码才会被执行

@FunctionalInterface; interface Swim { public abstract void swimming(); } public class Main { public static void main(String[] args) { // method( new Swim() { // // public void swimming() { // System.out.println("人在swimming"); // } // }); method( ()->{ System.out.println("小周正在游泳~"); } ); } public static void method(Swim s){ s.swimming(); } }
————(1)Lambda表达式实现无参抽象方法
interface SayHiInterface{ String sayHi(); } public class LambdaText3 { public static void main(String[] args) { SayHiInterface pi = ()->"你好啊,这是Lambda表达式"; } }
————(2)Lambda表达式实现有参抽象方法
interface AdditionInterface{ int add(int a,int b); } public class LambdaText4 { public static void main(String[] args) { AdditionInterface np = (x,y)-> x+y; int result = np.add(15,26); System.out.println(result); } }
————(3)Lambda表达式使用代码块
// 函数式接口 interface CheckGrade { // 查询成绩结果 String check(int grade); } // 测试类 public class GradeDemo { public static void main(String[] args) { // Lambda表达式实现代码块 CheckGrade g = (n) -> { // 如果成绩为90~100 if (n >= 90 && n <= 100) { // 输出成绩为优 return "成绩为优"; // 如果成绩为80~89 } else if (n >= 80 && n < 90) { // 输出成绩为良 return "成绩为良"; // 如果成绩为60~79 } else if (n >= 60 && n < 80) { // 输出成绩为中 return "成绩为中"; // 如果成绩小于60 } else if (n >= 0 && n < 60) { // 输出成绩为差 return "成绩为差"; // 其他数字不是有效成绩 } else { // 输出成绩无效 return "成绩无效"; } }; // 不要丢掉lambda语句后的分号 // 输出查询结果 System.out.println(g.check(89)); } }
———2、Lambda表达式调用外部变量
————(1)Lambda表达式无法更改局部变量

局部变量在Lambda表达式中默认被定义为final,也就是说,Lambda表达式只能调用局部变量,却不能改变其值。

  1. lambda表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda 表达式中的代码并没有被执行,因此在运行抽象方法之前类成员变量的值不会发生变化

  2. 只要抽象方法被调用,就会执行 lambda 表达式中的代码,类成员变量的值也就会被修改

Lambda表达式的执行规则

Lambda 表达式本身只是一个 “方法定义”,只有当你调用它对应的抽象方法时,Lambda 里的代码才会被执行

interface VariableInterface{ void method(); } public class LambdaText5 { public static void main(String[] args) { int value = 100; //创建局部变量 VariableInterface v = ()-> { int num = value - 90; value = 12; //更改局部变量,此处会报错,无法通过编译。 }; } }
————(2)Lambda表达式可以更改成员变量

类成员变量在Lambda表达式中不是被final修饰的,因此Lambda表达式可以改变其值。

  1. lambda 表达式可以调用并修改类成员变量的值

  2. lambda 表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda 表达式中的代码并没有被执行,因此在运行抽象方法之前类成员变量的值不会发生变化

  3. 只要抽象方法被调用,就会执行 lambda 表达式中的代码,类成员变量的值也就会被修改

Lambda表达式的执行规则

Lambda 表达式本身只是一个 “方法定义”,只有当你调用它对应的抽象方法时,Lambda 里的代码才会被执行

interface VariableInterface1{ void method(); } public class LambdaText6 { private int value = 100; public void action(){ 这一行只是【定义 Lambda】,并没有执行! VariableInterface1 v = ()-> { value = -12; }; System.out.println("运行接口方法前value=" + value); v.method();. 调用接口方法(真正执行 Lambda) System.out.println("运行接口方法后value=" + value); } public static void main(String[] args){ LambdaText6 demo = new LambdaText6(); demo.action(); } } 输出为:100 -12
———3、Lambda表达式与异常处理
  1. 接口的抽象方法可以在定义时声明抛出异常(比如void method() throws Exception;),用来保障程序安全性。

  2. Lambda 表达式本身不需要额外写抛出异常的语法,因为它会默认继承抽象方法声明的异常

  3. 当调用这个被 Lambda 实现的抽象方法时,必须手动进行异常处理(try-catch 捕获 或者 在调用方法上继续 throws 声明)。

(2)Lambda表达式的省略写法

Lambda表达式的省略写法

省略核心:可推导,可省略

method(()->{System.out.println("小周正在游泳~");});

先看上面例题的代码。

()-> 语句;

Lambda的省略规则:

  • 参数类型可以省略不写。

  • 如果只有一个参数,参数类型可以省略,同时()也可以省略。

  • 如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。

Lambda的完整格式:`

Arrays.sort(arr, (Integer o1,Integer o2)->{//方法的形参return o1-o2;//方法体});

Lambda的省略写法

Arrays.sort(arr,(o1,o2)-> o1-o2);

import java.util.Arrays; import java.util.Comparator; public class LambdaText2 { public static void main(String[] args) { String[] str = {"a","aaaa","aaa","aa"}; //匿名内部类 // Arrays.sort(str,new Comparator<String>(){ // @Override // public int compare(String o1, String o2) { // return o1.length()-o2.length(); // } // }); //Lambda表达式完整格式 // Arrays.sort(str,(String o1, String o2)->{ // return o1.length()-o2.length(); // }); //Lambda表达式省略格式 Arrays.sort(str,(o1,o2)->o1.length()-o2.length()); System.out.println(Arrays.toString(str)); } }
interface SayHiInterface{ String sayHi(); } public class LambdaText3 { public static void main(String[] args) { SayHiInterface pi = ()->"你好啊,这是Lambda表达式"; } }
interface AdditionInterface{ int add(int a,int b); } public class LambdaText4 { public static void main(String[] args) { AdditionInterface np = (x,y)-> x+y; int result = np.add(15,26); System.out.println(result); } }
http://www.gsyq.cn/news/1551149.html

相关文章:

  • VisualCppRedist AIO:终极指南!如何3分钟解决Windows系统90%的DLL错误
  • 成都无尘车间 EPC 总包 各类净化车间全套施工 - 洁净室推广助手
  • Windows字体自定义终极指南:No!! MeiryoUI快速上手教程
  • 总线分析器原理与实战:嵌入式调试的时序问题定位利器
  • Triton 入门:从编程思想到 SM、Warp、Register、SMEM、Program 与 Occupancy
  • PS810电量计配置与通信接口实战:从核心参数到I2C/HDQ避坑指南
  • 行业内评价高的FPC贴合设备厂家推荐排行榜2026 - 品牌排行榜
  • FIFA 23 Live Editor完全指南:打造你的专属足球世界
  • SLAM Toolbox终极教程:掌握ROS 2D SLAM的7个实战技巧与5大核心优势
  • 嵌入式开发基础:SysDS Loader与Picobug监控程序实战解析
  • LiveSplit:速通玩家的终极计时器,让每一秒都精准掌控 [特殊字符]⏱️
  • ctfshow 无字母数字代码执行
  • EasyLPAC:5个关键步骤掌握专业级eUICC智能卡管理工具
  • 2026年宁波AI推广服务商实测盘点与合规推荐 - 起跑123
  • 终极指南:使用urdf-viz轻松实现机器人URDF文件可视化
  • AI公平性工程新范式:因果推断与合规落地实战
  • AI创业五大致命陷阱:从需求失焦到数据枯竭的实战避坑指南
  • 3分钟搞定小爱音箱音乐服务:DID配置的终极完整指南 [特殊字符]
  • 嵌入式AEC算法库解析:从NLMS原理到DSP工程实践
  • 黑苹果新手福音:3大核心功能揭秘OpCore Simplify的智能化配置革命
  • MC68HC16Y3 SCI模块深度解析:从UART原理到工业通信实战
  • 【Springboot毕设全套源码+文档】基于Java+springboot自行车租赁系统(丰富项目+远程调试+讲解+定制)
  • 终极指南:让老旧Mac焕发新生,免费升级最新macOS系统
  • 4层架构重构:构建企业级可视化ETL数据集成平台
  • pd.read_html实战避坑指南:HTML表格解析的三大陷阱与生产级解决方案
  • 深度解析roop-unleashed:无训练AI换脸技术的架构设计与实践指南
  • Selenium UI自动化测试环境搭建:Python+ChromeDriver实战指南
  • TWR-WIFI-AR4100评估板硬件手册深度解析与嵌入式Wi-Fi集成实战
  • Gemini Ultra技术解析:统一多模态、确定性推理与云边端协同架构
  • 构建可复现的GPU大模型训练机:A100+EPYC分布式基础设施实践