网站公告

本次更新:没啥更新的

“钱塘江上潮信起,今日方知我是我”

Skip to content

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 → value

5.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 提供具体的数据收集方式。

Noctiflorous Garden · MIT License