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

简单学习 --> Lambda表达式

Lambda表达式

函数式接口

要理解Lambda表达式,首先要理解函数式接口;

函数式接口:一个接口有并且只有一个方法;

@FunctionalInterface 通过这个来帮你检查接口是否是函数式接口

@FunctionalInterface interface HanShuInterface{ void func() ; //只有一个func()就是函数式接口 void func2() ; //如果加一个func2(),上面的@FunctionalInterface会报错 }

函数式接口如何换成Lambda表达式

当我们使用Lambda表达式,需要知道接口里的方法是什么样的,有几个参数,返回值是什么

1. 函数式接口里的方法 没有参数,没有返回值

2. 有一个参数,没有返回值的方法
//有参数,没有返回值 @FunctionalInterface interface I2{ void func(int a) ; } I2 test = (int x) -> System.out.println(x); test.func(8); 最后输出8 ;
3. 有两个参数,没有返回值
//有两个参数,没有返回值 @FunctionalInterface interface I3{ void func(int a , int b) ; } I3 test = (int x , int y) -> System.out.println(x +" "+y); test.func(8 , 4); 输出 8 4

如果方法里有返回值,那么方法体需要{}括起来,或者 ()-> 4 ; 这个4就代表返回值

4. 没有参数,有返回值
//没有参数,有返回值 @FunctionalInterface interface I4{ int func() ; } I4 test = ()->{return 0;}; int a = test.func(); System.out.println(a); a就等于0,输出0

优化

9 就代表返回值9, a就等于9 ,输出 9 ;

5. 两个参数带返回值

最后a = 3 , b = 0 ;

匿名内部类的变量捕获

在匿名内部类当中使用过的变量,默认把他当成是一个常量 , (要么这个变量是final修饰的常量 , 要么这个这个变量没有被修改过)

int val = 0 ; I2 test = new I2() { @Override public void func(int a) { System.out.println(val); 正常的使用没有问题, val = 1 ; 修改val的值,这里会报错 System.out.println(a); } }; val = 3 ; 如果在这里修改val的值,也会报错,

在匿名内部类里捕获到的变量,如果在任何地方修改这个变量的值都会报错

Lambda的变量捕获

Lambda表达式里使用过的变量,这个变量也默认是一个常数不能修改, 因为Lambda表达式也是一个匿名内部类

Lambda的和集合的使用和方法

1.list的forEach() 方法,能输出集合里的全部元素

List<Integer> list =new ArrayList<>() ; list.add(1); list.add(2); list.add(3); 一般调用,创建一个内部类重写accept方法; list.forEach(new Consumer<Integer>() { @Override public void accept(Integer integer) { System.out.println(integer); } }); 用Lambda表达式,来写 list.forEach( i -> System.out.println(i));
2. list的sort() , 对集合里的元素排序

Comparator 也是一个函数式接口,里面只有一个compare方法 ,

list.sort((o1,o2) -> o1.compareTo(o2));
3. Map的forEach() ; 输出全部元素

BiConsumer 也是一个函数式接口 , 只有一个accept()方法,也可以用Lambda表达式

用匿名内部类来做 ;

Map<String , Integer> map = new HashMap<>(); map.put("a" , 1) ; map.put("b" , 2) ; map.put("c" , 3) ; map.forEach(new BiConsumer<String, Integer>() { @Override public void accept(String s, Integer integer) { System.out.println("key:" +s+ " val:" + integer ); } }); 用Lambda表达式 map.forEach((key , val) -> System.out.println("key:" +key+ " val:" + val ));

输出

key:a val:1

key:b val:2

key:c val:3

Lambda的优缺点

优点:代码简洁,方便

缺点:可读性差,不好调试检测

变量捕获问题

使用局部变量,而不是成员变量, ;一个局部变量,只在匿名内部类里使用,

而成员变量,作用域变大了, 在其他地方 修改 ,就可能会造成问题 ;

http://www.jsqmd.com/news/810858/

相关文章:

  • 2025届毕业生推荐的六大降AI率神器实际效果
  • Axure RP中文汉化终极指南:3分钟让英文界面变中文的完整教程
  • 终极指南:Shoelace项目结构与架构深度解析
  • 为什么NanoSVG是嵌入式系统和游戏开发的首选SVG解析器
  • 数据产品设计终极指南:如何用awesome-bigdata实现数据驱动开发
  • Pixelify版本更新日志分析:从Beta到v3.0的功能演进
  • 从手动复制到智能流转:5分钟掌握PT资源一键转载的高效革命
  • 工业DC-DC电源选型性能解析:钡特电源 DRB1-12S05LS 与 IB1205LS-1WR3 封装对照互通
  • ChatGLM3性能优化终极指南:不同硬件配置下的推理速度对比与预测
  • Kotlin扩展函数在Android Sunflower中的终极应用:10个提升代码简洁性的技巧
  • 发那科机器人SRVO-348报警:从DCS原理到接触器卡滞的深度诊断
  • 半导体产业回流:从成本中心到价值中心的战略重构
  • c++如何利用std--bitset高效存取数千个开关标志位到二进制文件【详解】
  • VMware Unlocker 3.0:如何在普通PC上安装macOS虚拟机的完整指南
  • Scrapfly MCP Server:为AI助手注入实时网页抓取能力
  • 社交媒体技能实战指南:从内容战略到个人品牌构建
  • React Redux TypeScript类型推断失败的5个常见问题及终极解决方案
  • 性能优化学习
  • 异构摄像设备协同适配,适配工业车间复杂环境跨镜追踪管控
  • ORAN专题系列-8:5G O-RAN Option7分体式小基站硬件白盒化的关键组件与部署场景剖析
  • 终极指南:如何将UglifyJS完美集成到Python Web框架中
  • AMD Ryzen终极调试指南:免费开源工具SMUDebugTool完整解析
  • Origin绘图实战:7个高频问题与高效解决方案
  • 如何5分钟掌握Jump:从安装到高效使用的完整教程
  • 告别Fastboot连接烦恼:Win10系统最新通用USB驱动(Google官方版)下载与配置全攻略
  • 终极指南:10个实用技巧提升TIL项目代码质量的完整教程
  • Style2Paints终极色彩修复指南:如何快速修复AI上色中的局部色彩问题 [特殊字符]
  • 用 FFmpeg 实现 RTMP 推流直播
  • Atoll-OS实战:开箱即用的AI助手操作系统部署与深度定制指南
  • 芯片开发中的原型验证:从虚拟模型到FPGA原型的工程实践