stream collect
时间: 2025-04-01 15:10:44 浏览: 19
### Java Stream API `collect` 方法使用示例
#### 基本用法
`collect` 方法是 Java Stream API 的一个重要终端操作,它可以将流中的元素汇聚到不同的数据结构中。例如,可以将流中的元素收集为列表、集合、字符串或者其他自定义类型的对象。
下面是一个简单的例子,展示如何使用 `collect` 将流中的元素收集为一个列表:
```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class CollectExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用 collect 收集为一个新的列表
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperCaseNames); // 输出: [ALICE, BOB, CHARLIE]
}
}
```
此代码片段展示了如何通过 `stream()` 方法创建流,并使用 `map` 转换每个元素为大写形式,最后通过 `Collectors.toList()` 将结果收集为一个新列表[^2]。
#### 收集为 Set
如果希望去除重复项并收集为一个无序的集合,则可以使用 `Collectors.toSet()` 方法:
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 1);
// 使用 collect 收集为一个 set,自动去重
Set<Integer> uniqueNumbers = numbers.stream()
.collect(Collectors.toSet());
System.out.println(uniqueNumbers); // 可能输出: [1, 2, 3, 4, 5]
```
这里使用了 `toSet()` 来确保最终的结果集中不会存在重复值[^3]。
#### 自定义收集器
除了内置的收集器外,还可以通过 `Collector.of()` 或者其他方式构建自定义的收集逻辑。以下是如何手动统计流中元素总数的例子:
```java
int sum = IntStream.rangeClosed(1, 10)
.boxed()
.collect(
() -> new int[]{0},
(arr, i) -> arr[0] += i,
(arr1, arr2) -> arr1[0] += arr2[0]
)[0];
System.out.println(sum); // 输出: 55
```
这段代码演示了一个较为复杂的场景——通过自定义收集器完成累加运算[^4]。
#### 结合分组与计数
当需要按照某些条件对数据进行分类时,可以借助于 `groupingBy` 和 `counting` 这样的组合型收集器:
```java
Map<Boolean, Long> evenOddCount = Arrays.asList(1, 2, 3, 4, 5).stream()
.collect(Collectors.groupingBy(i -> i % 2 == 0, Collectors.counting()));
System.out.println(evenOddCount); // 输出 {false=3, true=2}
```
上述实例说明了如何基于偶奇判断来进行分组并计算每类的数量[^5]。
---
阅读全文
相关推荐

















