### 概念
Stream 流是 Java 8 中引入的一个全新概念,用于解决已有集合类库既有的一些弊端。它允许以声明式的方式处理数据集合,可看作是遍历数据集的高级迭代器。Stream 流自己不会存储元素,也不会改变源对象,只是对数据源进行操作。其操作是惰性求值的,即在调用终端操作之前,中间操作不会立即执行,这意味着可以构建一个操作序列,然后在需要时一次性执行,以减少不必要的计算。此外,Stream API 基于函数式编程的理念,提供了丰富的中间操作和终端操作,可通过函数式接口来实现自定义操作。Stream 与 Lambda 表达式、方法引用结合紧密,让代码更简洁、可读性更强,还能充分利用多核架构进行并行处理 [^1][^2][^3][^4]。
### 用法
#### 创建 Stream 流
- **通过集合创建**:可以使用集合的 `stream()` 方法创建顺序流,使用 `parallelStream()` 方法创建并行流。
```java
import java.util.Arrays;
import java.util.List;
public class StreamCreation {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 创建顺序流
java.util.stream.Stream<Integer> sequentialStream = numbers.stream();
// 创建并行流
java.util.stream.Stream<Integer> parallelStream = numbers.parallelStream();
}
}
```
- **通过数组创建**:使用 `Arrays.stream()` 方法。
```java
import java.util.Arrays;
public class StreamFromArray {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
java.util.stream.IntStream stream = Arrays.stream(array);
}
}
```
- **使用 `Stream.of()` 方法**:可以将零散的数据转换为 Stream 流 [^5]。
```java
import java.util.stream.Stream;
public class StreamOfExample {
public static void main(String[] args) {
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stringStream = Stream.of("ab", "cd", "ef");
}
}
```
#### 中间操作
中间操作会返回一个新的 Stream 流,常见的中间操作有:
- **`filter()`**:用于过滤元素,只保留满足条件的元素。
```java
import java.util.Arrays;
import java.util.List;
public class FilterExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(System.out::println);
}
}
```
- **`map()`**:用于元素转换,将每个元素映射为另一个元素。
```java
import java.util.Arrays;
import java.util.List;
public class MapExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.map(n -> n * 2)
.forEach(System.out::println);
}
}
```
- **`sorted()`**:用于排序元素。
```java
import java.util.Arrays;
import java.util.List;
public class SortedExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);
numbers.stream()
.sorted()
.forEach(System.out::println);
}
}
```
#### 终端操作
终端操作会触发中间操作的执行,并产生一个最终结果,常见的终端操作有:
- **`forEach()`**:用于遍历元素。
```java
import java.util.Arrays;
import java.util.List;
public class ForEachExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.forEach(System.out::println);
}
}
```
- **`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<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers);
}
}
```
- **`count()`**:用于统计元素数量。
```java
import java.util.Arrays;
import java.util.List;
public class CountExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream()
.filter(n -> n % 2 == 0)
.count();
System.out.println(count);
}
}
```