前言:Java中的Stream是Java 8引入的一个新的API,用于处理集合数据和执行函数式编程。Stream提供了一种高效且简洁的方式来处理和操作集合数据,可以完成各种数据操作,如过滤、映射、排序、聚合等
目录
1. 创建Stream
2. Stream的中间操作
3. Stream的终端操作
4. 并行流操作
5. Stream的延迟执行
6. 使用Stream的注意事项:
1. 创建Stream:
- 通过集合创建Stream:`stream()`、`parallelStream()`
- 通过数组创建Stream:`Arrays.stream(array)`
- 通过Stream的静态方法创建:`Stream.of()`
- 通过文件创建Stream:`Files.lines(path)`
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream1 = numbers.stream(); // 通过集合创建Stream
int[] array = {1, 2, 3, 4, 5};
IntStream stream2 = Arrays.stream(array); // 通过数组创建Stream
Stream<String> stream3 = Stream.of("a", "b", "c"); // 通过Stream的静态方法创建
Stream<String> stream4 = Files.lines(Paths.get("file.txt")); // 通过文件创建Stream
2. Stream的中间操作:
- 过滤:`filter()`
- 映射:`map()`、`flatMap()`
- 排序:`sorted()`
- 去重:`distinct()`
- 截断:`limit()`、`skip()`
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Stream<String> filteredStream = names.stream().filter(name -> name.length() > 3); // 过滤
Stream<Integer> mappedStream = numbers.stream().map(number -> number * 2); // 映射
Stream<String> flatMappedStream = names.stream().flatMap(name -> Stream.of(name.split(""))); // 拆分映射
Stream<String> sortedStream = names.stream().sorted(); // 排序
Stream<String> distinctStream = names.stream().distinct(); // 去重
Stream<String> limitedStream = names.stream().limit(2); // 截断
Stream<String> skippedStream = names.stream().skip(2); // 跳过
3. Stream的终端操作:
- 聚合操作:`reduce()`、`collect()`
- 匹配操作:`allMatch()`、`anyMatch()`、`noneMatch()`
- 查找操作:`findFirst()`、`findAny()`
- 统计操作:`count()`
- 遍历操作:`forEach()`、`forEachOrdered()`
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b); // 聚合操作
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); // 收集操作
boolean allMatch = numbers.stream().allMatch(n -> n > 0); // 匹配操作
Optional<Integer> firstNumber = numbers.stream().findFirst(); // 查找操作
long count = numbers.stream().count(); // 统计操作
numbers.stream().forEach(System.out::println); // 遍历操作
4. 并行流操作:
- 使用`parallelStream()`开启并行流操作
- 使用`parallel()`和`sequential()`切换并行和顺序流操作
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> parallelList = numbers.parallelStream() // 使用parallelStream()开启并行流操作
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
List<Integer> sequentialList = numbers.parallelStream() // 切换回顺序流操作
.sequential()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
5. Stream的延迟执行:
- Stream的中间操作是延迟执行的,只有在终端操作调用时才会执行
- 这种延迟执行的特性可以提高性能,只对需要的元素进行操作
6. 使用Stream的注意事项:
- Stream只能被消费一次,一旦被消费后,就无法再使用
- Stream操作是无状态的,不会修改原始数据,而是生成新的Stream