jdk1.8stream流
时间: 2025-05-12 18:24:18 浏览: 21
### JDK 1.8 Stream API 使用教程及示例
#### 什么是Stream?
`Stream` 是 Java 8 引入的一个强大的功能,用于处理集合数据。它提供了一种声明式的操作方式来对集合中的元素进行过滤、映射、排序等操作。
---
#### 创建Stream的方式
可以使用多种方式创建 `Stream` 对象:
- **通过集合类的方法**
集合类提供了两个方法来创建 `Stream`: `Collection.stream()` 和 `Collection.parallelStream()`[^2]。
- **通过数组**
可以使用 `Arrays.stream(array)` 方法将数组转换为 `Stream`。
- **通过静态工厂方法**
`Stream.of(elements...)` 提供了一个简单的方式来创建一个包含指定元素的 `Stream`。
---
#### 基本操作分类
`Stream` 的操作分为两类:中间操作和终端操作。
- **中间操作**
返回一个新的 `Stream` 实例,允许链式调用多个中间操作。常见的中间操作包括:
- `filter(Predicate predicate)` 过滤符合条件的元素。
- `map(Function mapper)` 将每个元素应用给定函数后返回新的 `Stream`。
- `sorted([Comparator comparator])` 对流中的元素进行排序。
- `distinct()` 去除重复的元素[^4]。
- **终端操作**
终端操作会触发实际的数据处理过程,并通常不会返回另一个 `Stream`。常见的终端操作包括:
- `forEach(Consumer action)` 对每个元素执行特定的操作。
- `collect(Collector collector)` 收集结果到集合或其他容器中[^1]。
- `reduce(BinaryOperator accumulator)` 执行规约计算。
---
#### 示例代码
##### 示例1: 转换集合并收集结果
下面是一个简单的例子,展示如何从 `Stream` 流对象转成集合对象:
```java
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
Stream<String> stream = Stream.of("aa", "bb", "cc", "dd", "ee", "ee");
Set<String> set = stream.collect(Collectors.toSet());
for (String s : set){
System.out.println(s);
}
}
}
```
此代码展示了如何利用 `Collectors.toSet()` 将 `Stream` 转换成 `Set` 类型的集合。
---
##### 示例2: 排序与自定义比较器
以下代码演示了如何对字符串列表进行自然顺序排序以及基于年龄字段对学生列表进行降序排序:
```java
import java.util.*;
public class SortedStreamExample {
public static void main(String[] args) {
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("c");
list2.add("b");
list2.add("z");
// 自然顺序排序
list2.stream().sorted().forEach(a -> {
System.out.println(a);
});
// 定义学生类
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
List<Student> stuList = Arrays.asList(
new Student("Alice", 20),
new Student("Bob", 25),
new Student("Charlie", 30)
);
// 年龄降序排序
stuList.stream()
.sorted((o1, o2) -> o2.getAge() - o1.getAge())
.forEach(a -> {
System.out.println(a.getName());
});
}
}
```
上述代码分别实现了无参数排序和带参数排序的功能[^3]。
---
##### 示例3: 去重操作
以下是关于如何去重的例子:
```java
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DistinctStreamTest {
@Test
public void distinctStream(){
List<String> list = Arrays.asList("A", "B", "1", "A");
Stream<String> stream = list.stream();
Stream<String> stringStream = stream.distinct();
System.out.println("处理前:" + list);
System.out.println("处理后:" + stringStream.collect(Collectors.toList()));
}
}
```
这段代码说明了如何使用 `distinct()` 方法去除重复项。
---
#### 性能注意事项
虽然 `Stream` 提供了许多便利的操作,但在性能上需要注意以下几点:
- 如果可能的话,优先使用串行流而不是并行流,因为后者可能会引入额外的开销。
- 不要滥用复杂的 lambda 表达式或过多的中间操作,这可能导致难以调试的错误。
---
阅读全文
相关推荐


















