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

Java之lambda表达式

Lambda表达式简介

Lambda表达式是Java 8引入的一种匿名函数,用于简化函数式接口的实现。它允许将函数作为方法参数传递,或用于简化匿名内部类的写法。

Lambda语法结构

基本语法格式如下:

(parameters) -> expression

(parameters) -> { statements; }

Lambda表达式特点

  • 可选类型声明:参数类型可以省略,编译器能自动推断
  • 可选圆括号:单参数时可省略括号
  • 可选大括号:单行语句时可省略
  • 可选return关键字:单行表达式时会自动返回

常见使用场景

1. 替代匿名内部类

传统写法:

new Thread(new Runnable() {@Overridepublic void run() {System.out.println("传统写法");}
}).start();

Lambda写法:

new Thread(() -> System.out.println("Lambda写法")).start();

2. 集合遍历

传统写法:

List<String> list = Arrays.asList("a", "b", "c");
for (String s : list) {System.out.println(s);
}

Lambda写法:

list.forEach(s -> System.out.println(s));

3. 排序操作

传统写法:

Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}
});

Lambda写法:

Collections.sort(list, (o1, o2) -> o1.compareTo(o2));

函数式接口

Lambda表达式需要与函数式接口配合使用。函数式接口是指仅包含一个抽象方法的接口,常用注解@FunctionalInterface标识。

Java内置的常用函数式接口:

  • Predicate<T>:接受一个参数返回boolean
  • Function<T,R>:接受一个参数返回一个结果
  • Consumer<T>:接受一个参数不返回结果
  • Supplier<T>:不接受参数返回一个结果

方法引用

Lambda表达式的简写形式,使用::符号表示。

四种形式:

  1. 静态方法引用:ClassName::staticMethod
  2. 实例方法引用:instance::method
  3. 特定类型的任意对象方法引用:ClassName::method
  4. 构造方法引用:ClassName::new

示例:

list.forEach(System.out::println);

变量作用域

Lambda表达式可以访问:

  • 类成员变量和静态变量
  • 局部final变量或事实上的final变量

不能访问非final的局部变量,否则会编译错误。

优缺点分析

优点:

  • 简化代码,提高可读性
  • 支持函数式编程风格
  • 便于并行操作集合

缺点:

  • 调试相对困难
  • 性能在特定场景下可能不如传统写法
  • 过度使用可能降低代码可读性

实际应用示例

过滤集合
List<String> filtered = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());

映射转换
List<Integer> lengths = list.stream().map(s -> s.length()).collect(Collectors.toList());

排序组合
list.sort((s1, s2) -> {if (s1.length() != s2.length()) {return s1.length() - s2.length();}return s1.compareTo(s2);
});

Lambda表达式为Java带来了函数式编程能力,合理使用可以显著提升代码简洁性和表达力,但也需要注意适度使用以避免代码可读性下降。

http://www.dtcms.com/a/577185.html

相关文章:

  • JavaSe—Stream流☆
  • 如何用ae做模板下载网站wordpress搭建知识库
  • 网站开发需求清单南昌seo搜索排名
  • N32H高性能32位MCU在具身机器人上的应用
  • 网站广告收费标准电子工程网络通信的专业课
  • 实时将大模型的解决方案转换为随机应变的机器人指令
  • 在 Vue 3 + Vite 项目中使用 Less 实现自适应布局:VW 和 VH 的应用
  • codeforces1914 C~F
  • 海外住宅ip怎么区分干净程度以及怎么选择海外住宅ip
  • 酒店团购的网站建设承德网媒
  • 在网站中动态效果怎么做网站的备案要求
  • 昭和仙君(五十八)标签票据模板服务器端技术——东方仙盟筑基期
  • Dart语言空安全概念与原理详解
  • MongoDB 查询分析
  • 如何在OnePlus手机上删除短信
  • MQTT的QoS2中四次握手与TCP的三次握手、四次挥手的异同
  • 10个css更新
  • Git 实现github仓库管理-删除指定目录下的所有文件并保留目录结构
  • INT305 Machine Learning 机器学习 Pt.6 卷积神经网络(Convolutional Neural Network)
  • 方案分享:一款基于低功耗单片机的腰腹甩脂机方案
  • 鸿蒙开发TypeScript第三课:数组
  • React 15
  • 浏览器开发者工具(尤其是 Vue Devtools 扩展)和 Vuex 的的订阅模式冲突
  • 网站建设核电程序员找工作的网站
  • 特殊三列布局需求
  • js(DOM)基础:11、DOM定义、事件、文档的加载、DOM查询1、DOM实现轮播图、DOM查询2、DOM实现全选
  • 想做个电影网站该怎么做阳春ycqq人才招聘信息
  • JavaScript的Web APIs 入门到实战(day4):DOM 进阶与日期对象(附巩固练习和案例讲解)
  • AtCoder Educational DP Contest 刷题记录Ⅰ
  • WPF CalcBinding简化判断逻辑