Stream流
在Java中,Stream流是Java 8引入的一个强大的功能,它提供了一种高效且声明式的方式来处理集合数据。Stream并不是一个数据结构,而是一个数据处理的抽象概念,它允许你以声明式的方式对集合进行操作,例如过滤、排序、转换和聚合等。
Stream 的特点
1. **声明式**:Stream 提供了声明式的方式来处理数据,代码更加简洁易读。
2. **链式调用**:Stream 的操作可以链式调用,形成一个操作流水线。
3. **并行支持**:Stream 提供了并行处理的能力,可以轻松地将单线程操作转换为多线程操作。
4. **惰性求值**:Stream 的操作是惰性求值的,只有在需要时才会执行。
Stream 的主要操作
Stream 的操作可以分为两类:
1. **中间操作(Intermediate Operations)**:返回一个新的 Stream,用于进一步操作。例如:
- `filter`:过滤元素。
- `map`:转换元素。
- `sorted`:排序。
- `distinct`:去重。
2. **终端操作(Terminal Operations)**:返回一个结果或副作用,结束 Stream 的操作。例如:
- `forEach`:遍历元素。
- `collect`:收集结果。
- `sum`、`max`、`min`、`count`:聚合操作。
### 日常工作中如何使用 Stream
1. 过滤和转换数据
Stream 提供了非常方便的方式来过滤和转换数据。例如,从一个列表中筛选出符合条件的元素,并对它们进行操作。
筛选出偶数并平方
import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 筛选出偶数并平方List<Integer> result = numbers.stream().filter(n -> n % 2 == 0) // 筛选出偶数.map(n -> n * n) // 平方.collect(Collectors.toList()); // 收集结果System.out.println(result); // 输出:[4, 16]}
}
2. 数据聚合
Stream 提供了多种聚合操作,例如求和、最大值、最小值、计数等。
计算列表中所有偶数的和
import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 计算所有偶数的和int sum = numbers.stream().filter(n -> n % 2 == 0) // 筛选出偶数.mapToInt(Integer::intValue) // 转换为 int 类型.sum(); // 求和System.out.println(sum); // 输出:6}
}
3. 数据排序
Stream 提供了 `sorted` 方法,可以方便地对数据进行排序。
对列表进行排序
import java.util.Arras;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(5, 2, 3, 1, 4);// 对列表进行排序List<Integer> sortedNumbers = numbers.stream().sorted() // 排序.collect(Collectors.toList()); // 收集结果System.out.println(sortedNumbers); // 输出:[1, 2, 3, 4, 5]}
}
4. 数据去重
Stream 提供了 `distinct` 方法,可以方便地去除重复元素。
去除列表中的重复元素
import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);// 去除重复元素List<Integer> uniqueNumbers = numbers.stream().distinct() // 去重.collect(Collectors.toList()); // 收集结果System.out.println(uniqueNumbers); // 输出:[1, 2, 3, 4, 5]}
}
5. 并行处理
Stream 提供了并行处理的能力,可以通过 `parallelStream` 方法将单线程操作转换为多线程操作。
并行计算列表中所有偶数的和
import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 并行计算所有偶数的和int sum = numbers.parallelStream() // 使用并行流.filter(n -> n % 2 == 0) // 筛选出偶数.mapToInt(Integer::intValue) // 转换为 int 类型.sum(); // 求和System.out.println(sum); // 输出:30}
}
6. 数据分组
Stream 提供了 `Collectors.groupingBy` 方法,可以方便地对数据进行分组。
按奇偶性对列表进行分组
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 按奇偶性分组Map<Boolean, List<Integer>> groupedNumbers = numbers.stream().collect(Collectors.groupingBy(n -> n % 2 == 0)); // 分组System.out.println(groupedNumbers); // 输出:{false=[1, 3, 5], true=[2, 4, 6]}}
}
总结
Stream 提供了一种高效且声明式的方式来处理集合数据,能够显著简化代码并提高开发效率。在日常工作中,你可以通过以下方式使用 Stream:
1. **过滤和转换数据**:使用 `filter`、`map` 等方法。
2. **数据聚合**:使用 `sum`、`max`、`min`、`count` 等方法。
3. **数据排序**:使用 `sorted` 方法。
4. **数据去重**:使用 `distinct` 方法。
5. **并行处理**:使用 `parallelStream` 方法。
6. **数据分组**:使用 `Collectors.groupingBy` 方法。
Stream 的强大之处在于它的声明式语法和链式调用,使得代码更加简洁易读。同时,Stream 的并行处理能力也使得它在处理大规模数据时更加高效。