【Java Stream详解】
文章目录
- 前言
- 一、Stream概述
- 1.1 什么是 Stream?
- 1.2 Stream 和集合的区别
- 二、Stream的创建方式
- 2.1 基于集合创建
- 2.2 基于数组创建
- 2.3 使用 `Stream.generate()`
- 2.4 使用 `Stream.iterate()`
- 三、Stream常见操作
- 3.1 中间操作(Intermediate)
- ① filter:过滤元素
- ② map:映射操作
- ③ flatMap:扁平化处理
- ④ sorted:排序
- 3.2 终端操作(Terminal)
- ① collect:将流转换为集合
- ② reduce:合并元素
- 四、并行流处理
- 五、使用 Stream 处理用户数据
- 六、总结
前言
Java Stream 是 Java 8 引入的一项强大特性,主要用于处理集合数据。它提供了类似于函数式编程的方式,使代码更加简洁、易读,同时提高了效率。本文将详细介绍 Stream 的基本概念、常用操作、使用场景。
一、Stream概述
1.1 什么是 Stream?
Stream
是 Java 8 中引入的一个新接口,它专注于对集合对象进行处理,支持类似 SQL 的操作,例如:过滤、映射、排序、统计、收集等。Stream 提供了链式操作方式,使代码简洁且易读。
1.2 Stream 和集合的区别
特性 | Stream | 集合 |
---|---|---|
数据存储方式 | 不存储数据,仅处理数据流 | 存储数据 |
是否可复用 | 只能使用一次 | 可重复使用 |
是否支持惰性求值 | 惰性求值,仅在终端操作时才会执行 | 不支持惰性求值 |
并行处理 | 支持多核并行处理 | 不支持直接并行处理 |
二、Stream的创建方式
2.1 基于集合创建
import java.util.stream.Stream;
import java.util.List;
public class StreamDemo {
public static void main(String[] args) {
List<String> list = List.of("Java", "Python", "C++", "Go");
// 将集合转换为 Stream
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
}
}
2.2 基于数组创建
import java.util.stream.Stream;
public class StreamFromArray {
public static void main(String[] args) {
String[] languages = {"Java", "Python", "C++"};
Stream<String> stream = Stream.of(languages);
stream.forEach(System.out::println);
}
}
2.3 使用 Stream.generate()
import java.util.stream.Stream;
public class StreamGenerate {
public static void main(String[] args) {
// 无限流,生成随机数,限制输出5个
Stream<Double> randomStream = Stream.generate(Math::random).limit(5);
randomStream.forEach(System.out::println);
}
}
2.4 使用 Stream.iterate()
import java.util.stream.Stream;
public class StreamIterate {
public static void main(String[] args) {
// 从1开始,每次加2,生成偶数流
Stream<Integer> stream = Stream.iterate(1, n -> n + 2).limit(5);
stream.forEach(System.out::println);
}
}
三、Stream常见操作
3.1 中间操作(Intermediate)
中间操作返回新的流对象,不会触发终端操作。常见的中间操作包括:
filter(Predicate)
:过滤元素map(Function)
:映射操作flatMap(Function)
:扁平化操作sorted(Comparator)
:排序distinct()
:去重limit(n)
:限制流中元素个数skip(n)
:跳过前 n 个元素
① filter:过滤元素
import java.util.stream.Stream;
public class FilterDemo {
public static void main(String[] args) {
Stream.of("Java", "Python", "Go", "C++")
.filter(lang -> lang.length() > 3)
.forEach(System.out::println);
}
}
② map:映射操作
将元素转换为新的形式:
import java.util.stream.Stream;
public class MapDemo {
public static void main(String[] args) {
Stream.of("java", "python", "c++")
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
③ flatMap:扁平化处理
将流中的元素展开成单个元素流:
import java.util.stream.Stream;
public class FlatMapDemo {
public static void main(String[] args) {
Stream.of("Java,Python", "Go,C++")
.flatMap(lang -> Stream.of(lang.split(",")))
.forEach(System.out::println);
}
}
④ sorted:排序
对流进行排序:
import java.util.stream.Stream;
public class SortedDemo {
public static void main(String[] args) {
Stream.of(5, 3, 8, 1, 2)
.sorted()
.forEach(System.out::println);
}
}
3.2 终端操作(Terminal)
终端操作会触发流的执行,并返回结果。常见的终端操作包括:
forEach(Consumer)
:遍历collect(Collectors)
:收集count()
:计数reduce(BinaryOperator)
:合并min(Comparator)
和max(Comparator)
:最小值和最大值anyMatch
、allMatch
和noneMatch
:匹配操作
① collect:将流转换为集合
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CollectDemo {
public static void main(String[] args) {
List<String> list = Stream.of("Java", "Python", "Go")
.collect(Collectors.toList());
System.out.println(list);
}
}
② reduce:合并元素
import java.util.stream.Stream;
public class ReduceDemo {
public static void main(String[] args) {
int sum = Stream.of(1, 2, 3, 4)
.reduce(0, Integer::sum);
System.out.println("Sum: " + sum);
}
}
四、并行流处理
Java Stream 支持多线程并行处理,通过 parallelStream()
可以实现自动并行计算。
import java.util.List;
public class ParallelStreamDemo {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
// 并行流处理
numbers.parallelStream()
.map(num -> num * 2)
.forEach(System.out::println);
}
}
五、使用 Stream 处理用户数据
import java.util.List;
import java.util.stream.Collectors;
class User {
String name;
int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
public class StreamCase {
public static void main(String[] args) {
List<User> users = List.of(
new User("Alice", 23),
new User("Bob", 30),
new User("Charlie", 27),
new User("David", 35)
);
// 筛选年龄大于25岁的用户,并按年龄排序
List<String> names = users.stream()
.filter(u -> u.age > 25)
.sorted((u1, u2) -> Integer.compare(u1.age, u2.age))
.map(u -> u.name)
.collect(Collectors.toList());
System.out.println("筛选结果: " + names);
}
}
六、总结
- Stream 提供了简洁、易读的集合操作方式,常用于数据过滤、映射、聚合等操作。
- 中间操作返回新的流对象,不执行终端操作不会触发计算。
- 终端操作触发流的计算并返回结果。
- 并行流可轻松实现多线程并行处理。
✅ 使用 Stream 可以提高代码的可读性和开发效率,尤其在集合数据处理时非常实用!