Collectors
字数: 0 字 时长: 0 分钟
1. 概述
collect() 用于将 Stream 中的数据收集成集合。
常见的收集方式:
java
Collectors.toList()
Collectors.toSet()
Collectors.toMap()可以简单理解为:
text
Stream
↓
collect()
↓
Collectors
↓
List / Set / Map原笔记主要整理了 toList()、toSet() 和 toMap() 三种用法。:contentReference[oaicite:0]
2. Collectors.toList()
Collectors.toList() 用于将 Stream 中的数据收集为 List。
例如:获取所有作者的姓名。
java
List<Author> authors = getAuthors();
List<String> collect = authors.stream()
.map(author -> author.getName())
.collect(Collectors.toList());
System.out.println(collect);执行过程:
text
Stream<Author>
↓
map()
↓
Stream<String>
↓
Collectors.toList()
↓
List<String>3. Collectors.toSet()
Collectors.toSet() 用于将 Stream 中的数据收集为 Set。
例如:获取所有书籍的名称。
java
List<Author> authors = getAuthors();
Set<String> collect = authors.stream()
.flatMap(author -> author.getBooks().stream())
.map(book -> book.getName())
.collect(Collectors.toSet());
System.out.println(collect);执行过程:
text
Stream<Author>
↓
flatMap()
↓
Stream<Book>
↓
map()
↓
Stream<String>
↓
Collectors.toSet()
↓
Set<String>toList() 和 toSet() 在原笔记中的用途分别是收集作者姓名和书名。:contentReference[oaicite:1]
4. Collectors.toMap()
Collectors.toMap() 用于将 Stream 中的数据收集为 Map。
例如:
text
key → 作者姓名
value → 作者的书籍列表4.1 完整写法
java
List<Author> authors = getAuthors();
Map<String, List<Book>> collect = authors.stream()
.collect(Collectors.toMap(
new Function<Author, String>() {
@Override
public String apply(Author author) {
return author.getName();
}
},
new Function<Author, List<Book>>() {
@Override
public List<Book> apply(Author author) {
return author.getBooks();
}
}
));4.2 Lambda 简化
java
List<Author> authors = getAuthors();
Map<String, List<Book>> collect = authors.stream()
.distinct()
.collect(Collectors.toMap(
author -> author.getName(),
author -> author.getBooks()
));
System.out.println(collect);这里:
java
author -> author.getName()用于生成 Map 的 key。
java
author -> author.getBooks()用于生成 Map 的 value。:contentReference[oaicite:2]
5. toMap() 参数
toMap() 可以简单理解为:
java
Collectors.toMap(
keyMapper,
valueMapper
)其中:
text
第一个参数
↓
生成 key
第二个参数
↓
生成 value例如:
java
Collectors.toMap(
author -> author.getName(),
author -> author.getBooks()
)等价于:
text
Author
├── name → key
└── books → value5.1 key 冲突
如果生成的 key 出现重复,需要处理 key 冲突。
此时可以使用 toMap() 的第三个参数:
java
Collectors.toMap(
keyMapper,
valueMapper,
mergeFunction
)第三个参数用于定义:
当新元素生成的 key 已经存在时,应该如何处理两个 value。
原笔记对 toMap() 的三个参数分别总结为生成 key、生成 value 和处理 key 冲突。:contentReference[oaicite:3]
6. 小结
常用的 Collectors:
| 方法 | 作用 | 结果 |
|---|---|---|
Collectors.toList() | 收集数据 | List |
Collectors.toSet() | 收集数据 | Set |
Collectors.toMap() | 按 key-value 收集数据 | Map |
简单记忆:
text
toList()
↓
List
toSet()
↓
Set
toMap()
↓
Map核心使用方式:
java
stream.collect(Collectors.toList());
stream.collect(Collectors.toSet());
stream.collect(Collectors.toMap(
keyMapper,
valueMapper
));
collect()负责执行收集操作,Collectors提供具体的数据收集方式。