java stream 内部方法
时间: 2025-02-01 08:27:46 浏览: 38
### Java Stream 内部方法解析
Java Stream 是一种用于处理集合的强大工具,提供了丰富的内部操作方法来简化数据处理逻辑。这些内部方法可以分为中间操作和终端操作。
#### 中间操作
中间操作返回一个新的流对象,并且可以在同一个流上链式调用多个中间操作。常见的中间操作有:
- `filter(Predicate p)`:过滤掉不符合条件的元素[^1]。
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
```
- `map(Function f)`:将每个元素转换成另一个形式[^2]。
```java
List<String> strings = Arrays.asList("a", "b", "c");
List<Integer> lengths = strings.stream()
.map(String::length)
.collect(Collectors.toList());
```
- `flatMap(Function f)`:先对每个输入应用函数f得到新的流,再把这些新产生的流连接起来形成一个单独的结果流。
```java
List<List<Integer>> lists = Arrays.asList(
Arrays.asList(1),
Arrays.asList(2, 3),
Arrays.asList(4, 5, 6)
);
List<Integer> flatList = lists.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
```
- `distinct()`:去除重复项。
```java
List<Integer> distinctNumbers = Arrays.asList(1, 2, 2, 3, 3, 3).stream()
.distinct()
.collect(Collectors.toList());
```
- `sorted([Comparator c])`:按照自然顺序或指定比较器排序。
```java
List<Integer> sortedNumbers = Arrays.asList(3, 1, 2).stream()
.sorted()
.collect(Collectors.toList());
```
#### 终端操作
当执行到终端操作时,整个流管道才会真正开始计算。一旦完成,就不能再次对该流实例进行任何其他的操作了。典型的终端操作包括但不限于:
- `forEach(Consumer action)`:遍历所有元素并对其施加给定的动作。
```java
Integer[] array = {1, 2, 3};
Arrays.stream(array).forEach(System.out::println);
```
- `reduce(BinaryOperator b)` 或者 `reduce(T identity, BinaryOperator b)` :通过二元运算符累积求值。
```java
Optional<Integer> sum = IntStream.rangeClosed(1, 5).boxed().reduce(Integer::sum);
```
- `collect(Collector collector)`:收集结果至容器或其他结构化输出中。
```java
Map<Boolean, List<Person>> partitionedPeople =
people.stream().collect(Collectors.partitioningBy(Person::isAdult));
```
需要注意的是,在使用流的过程中如果尝试多次读取同一份资源,则会抛出异常如 `IllegalStateException: stream has already been operated upon or closed` 。
阅读全文
相关推荐


















