第17章 Lambda表达式与函数式接口1
需积分: 0 127 浏览量
更新于2022-08-08
收藏 93KB DOCX 举报
Java 8 的发布引入了Lambda表达式和Stream API,这是自Java 5以来对语言的重大改进,极大地提升了代码的简洁性和可读性。Lambda表达式是实现单一抽象方法(SAM)接口的一种简洁语法,它允许程序员以更面向函数的方式编写代码,减少了冗余和提高了代码的可维护性。
### 17.1 Lambda表达式
#### 17.1.1 Lambda表达式引入
Lambda表达式的使用通常可以分为以下几个示例:
1. **线程创建**:在Java 8之前,创建线程通常需要实现`Runnable`接口并创建匿名内部类。但使用Lambda表达式,我们可以简化这一过程,如下所示:
```java
// 传统方式
new Thread(new Runnable() {
public void run() {
System.out.println("do something..");
}
}).start();
// 使用Lambda
new Thread(() -> System.out.println("do something..")).start();
```
2. **集合遍历**:在遍历集合时,Lambda表达式可以替代传统的`for-each`循环,提高代码的可读性:
```java
// 传统方式
List<String> list = Arrays.asList("hello", "java", "atguigu", "lambda");
for (String string : list) {
System.out.println(string);
}
// 使用Lambda
list.forEach(System.out::println);
```
3. **文件过滤**:文件过滤是另一个很好的应用示例,使用Lambda表达式可以简洁地定义过滤规则:
```java
// 传统方式
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File file) {
return !file.isDirectory() && file.getName().endsWith(".java");
}
};
File[] files = fileDir.listFiles(filter);
// 使用Lambda
File[] files = fileDir.listFiles(file -> !file.isDirectory() && file.getName().endsWith(".java"));
```
#### 17.1.2 函数式接口
Lambda表达式是基于函数式接口实现的。函数式接口是指只有一个抽象方法的接口,它可以被用作Lambda表达式的类型。虽然任何有单一抽象方法的接口都可以作为Lambda的类型,但为了明确,Java 8引入了一个`@FunctionalInterface`注解来标识这样的接口。
以下是一些Java 8之前的核心函数式接口示例:
1. **`Runnable`**:无返回值的任务,只有一个`run()`方法。
2. **`Callable`**:带有返回值的任务,有一个`call()`方法,用于返回结果。
3. **`Comparator`**:比较两个对象的接口,有一个`compare()`方法,用于确定两个对象的顺序。
4. **`Comparable`**:实现此接口的类可以比较其实例的自然顺序,有一个`compareTo()`方法。
Java 8还添加了一些新的函数式接口,如`Predicate`(用于断言条件)、`Function`(用于转换操作)和`Consumer`(用于消费输入),它们在Stream API中扮演着重要角色。
### 17.2 Stream API
Stream API是Java 8中的另一大创新,它提供了对集合数据进行高效和易读的操作方式。Stream API支持管道操作,可以将一系列操作链接在一起,如过滤、映射和聚合,从而简化了对大量数据的操作。
例如,使用Stream API可以更简洁地完成文件名的过滤和打印:
```java
// 使用Stream API
Arrays.stream(fileDir.listFiles())
.filter(file -> !file.isDirectory() && file.getName().endsWith(".java"))
.forEach(System.out::println);
```
总结来说,Lambda表达式和Stream API为Java 8带来了更简洁、更具表现力的代码风格,使Java开发者能够充分利用函数式编程的优点,提升开发效率和代码质量。在实际开发中,理解和掌握这些新特性是非常重要的。
AIAlchemist
- 粉丝: 1008
- 资源: 304
最新资源
- 基于java+ssm+mysql的大学生社团管理系统任务书.docx
- 客户流失预测/产品推荐算法介绍
- 基于java+ssm+mysql的蛋糕甜品店管理系统开题报告.doc
- 应急响应实战笔记:入侵分析、日志分析、权限维持、windows实战篇、LInux实战篇、WEB实战篇
- 基于java+ssm+mysql的点餐系统开题报告.docx
- 工作汇报ppt模板(黑色主题)
- 基于java+ssm+mysql的点餐系统任务书.docx
- python-7.纪念品分组-我的啦.py
- 基于java+ssm+mysql的公交车信息管理系统开题报告.doc
- python-8.统计数字-但是很大.py
- 基于java+ssm+mysql的公交车信息管理系统任务书.docx
- python-9.字符串的展开-领域!展开!.py
- browser-protocol
- 良人啊_Signed.apk
- 数智化时代医院临床试验人才培养的创新路径与实践探索.pdf
- KUKA OMNIMOVE重载型移动式运输平台工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip