一、流的基础概念
-
流(Stream):
- 定义:流是一种可以在数据集合上进行操作的抽象化序列,它没有存储数据的能力,而是通过一系列的操作来处理数据。
- 特性 :
- 无存储:流不存储数据,只是数据的"视图"。
- 函数式编程:流的操作采用函数式编程风格。
- 惰性求值:中间操作是惰性求值的,直到遇到终端操作才会真正执行。
- 链式操作:流的中间操作可以链式调用,形成处理管道。
-
流的类型:
- 顺序流:按顺序处理数据。
- 并行流:利用多核处理器并行处理数据。
二、流的创建
流可以从多种数据源创建,常见的方法有:
-
从集合创建流:
List<String> list = Arrays.asList("apple", "banana", "cherry"); Stream<String> stream = list.stream();
-
从数组创建流:
String[] array = {"apple", "banana", "cherry"}; Stream<String> stream = Arrays.stream(array);
-
使用 Stream.of() 方法:
Stream<String> stream = Stream.of("apple", "banana", "cherry");
-
生成无限流:
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2); // 生成一个无限递增的流
三、流的操作
流操作分为两类:中间操作和终端操作。
-
中间操作:返回一个新的流,不会立刻执行,主要用于处理数据。常见的中间操作有:
-
过滤(Filter) :
Stream<String> filteredStream = stream.filter(s -> s.startsWith("a"));
-
映射(Map) :
Stream<String> upperCaseStream = stream.map(String::toUpperCase);
-
排序(Sorted) :
Stream<String> sortedStream = stream.sorted();
-
-
终端操作:触发流的计算并生成结果。常见的终端操作有:
-
遍历(ForEach) :
stream.forEach(System.out::println);
-
收集(Collect) :
List<String> resultList = stream.collect(Collectors.toList());
-
计数(Count) :
long count = stream.count();
-
四、流式编程的示例
下面是一个示例,展示了如何使用流来处理一个字符串列表,进行过滤、映射、排序,并最终收集结果:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
// 创建一个包含字符串的列表
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape");
// 创建流并进行一系列处理操作
List<String> result = fruits.stream()
.filter(fruit -> fruit.length() > 4) // 过滤长度大于4的水果
.map(String::toUpperCase) // 将所有水果名称转换为大写
.sorted() // 对结果进行排序
.collect(Collectors.toList()); // 收集结果到列表中
// 打印结果
System.out.println(result); // 输出: [BANANA, CHERRY]
}
}
五、流的性能考虑
-
惰性求值:中间操作是惰性求值的,只有在遇到终端操作时才会执行。因此,可以将多个中间操作链式组合,避免不必要的计算。
-
并行流 :通过
parallelStream()
方法可以创建并行流,利用多核处理器提高性能。但并行流的性能提升依赖于数据集的大小和操作的复杂性,使用时需要评估性能开销。List<String> result = fruits.parallelStream() .filter(fruit -> fruit.length() > 4) .map(String::toUpperCase) .sorted() .collect(Collectors.toList());
六、总结
Java 流式编程通过简洁的 API 提供了高效、可读性强的数据处理方式。理解流的创建、操作和性能特点,能够帮助开发者更好地利用流式编程解决实际问题。