"本文主要介绍了Java 8中的Stream API,结合Lambda表达式,展示了如何高效地处理集合数据,包括筛选、归约、分组和聚合等操作。文章提供了20个实例来帮助读者理解Stream的使用,同时也强调了Stream与传统迭代方式的区别以及其特性。"
Java 8 引入的Stream API极大地简化了集合数据的处理,尤其是配合Lambda表达式的使用,使得代码更加简洁、易读。Stream API将集合视作一种流,允许我们在数据流中进行一系列操作,而无需显式地遍历集合。它提供了一系列中间操作(intermediate operations)和终端操作(terminal operations)。
1. Stream 概述
Stream不是存储数据的容器,而是用于处理数据的工具。它执行的操作通常是延迟的,直到遇到终端操作时才真正开始计算。Stream有两种模式:顺序流(sequential stream)和并行流(parallel stream),并行流可以利用多核处理器的优势,提高处理效率。
2. Stream 的创建
Stream可以从集合或数组中创建。对于集合,可以调用`Collection.stream()`得到顺序流,或者调用`Collection.parallelStream()`得到并行流。例如:
```java
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> sequentialStream = list.stream();
Stream<String> parallelStream = list.parallelStream();
```
3. 中间操作
中间操作包括筛选(filter)、映射(map)、排序(sorted)等,它们返回一个新的Stream,可以链式调用。例如,筛选出薪资大于8000的员工:
```java
employees.stream().filter(employee -> employee.getSalary() > 8000);
```
4. 终端操作
终端操作如`collect`、`forEach`、`count`等,它们执行实际的计算,并产生最终结果。例如,统计员工薪资之和:
```java
long sum = employees.stream()
.mapToInt(Employee::getSalary)
.sum();
```
或者将员工按薪资排序:
```java
employees.stream()
.sorted(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getAge))
.collect(Collectors.toList());
```
5. 归约操作
归约操作如`reduce`,可以用来求和、求最大值、最小值等。统计最高薪资:
```java
OptionalInt maxSalary = employees.stream()
.mapToInt(Employee::getSalary)
.max();
```
平均薪资:
```java
double averageSalary = employees.stream()
.mapToDouble(Employee::getSalary)
.average()
.orElse(0);
```
6. 分组与聚合
使用`Collectors.groupingBy`可以将员工按性别分组:
```java
Map<String, List<Employee>> groupedByGender = employees.stream()
.collect(Collectors.groupingBy(Employee::getGender));
```
按性别和地区分组:
```java
Map<String, Map<String, List<Employee>>> groupedByGenderAndRegion = employees.stream()
.collect(Collectors.groupingBy(Employee::getGender,
Collectors.groupingBy(Employee::getRegion)));
```
将员工按薪资是否高于8000分为两部分:
```java
Map<Boolean, List<Employee>> highOrLowSalary = employees.stream()
.collect(Collectors.partitioningBy(employee -> employee.getSalary() > 8000));
```
通过这些实例,我们可以看到Stream API如何使集合操作变得更加高效和直观,减少了代码的冗余。在处理大量数据时,使用Stream API和并行流可以显著提升程序性能。同时,Stream API也遵循了函数式编程的思想,使Java编程更加现代化。