什么是Stream流?
在Java中,Stream
流是一种用于处理集合数据的抽象概念,它可以高效、简洁地对集合进行一系列的操作,比如过滤、排序、映射等。Stream
API 是在 Java 8 中引入的,属于 Java 的新特性之一。
Stream流的特点
- 惰性求值:
Stream
操作是延迟执行的,只有在需要结果时才会计算(比如调用collect()
方法)。 - 链式操作:通过链式调用,可以将多个操作组合成一个清晰的流水线,避免繁琐的 for 循环和临时变量。
- 内部迭代:使用
Stream
,数据的遍历由内部完成(而不是由外部的 for 循环完成),使得代码更简洁。 - 不可变性:
Stream
本身不会修改底层的数据结构,而是会返回一个新的Stream
,所以是不可变的。
Stream流的核心操作
Stream
API 提供了丰富的操作,可以分为两类:
-
中间操作:返回一个新的
Stream
,可以继续链式调用。常见的中间操作有:filter
:过滤出符合条件的元素map
:对每个元素进行转换操作sorted
:对元素进行排序distinct
:去重limit
:限制返回的元素数量skip
:跳过指定数量的元素
-
终结操作:触发流的计算并返回最终结果,不能继续链式调用。常见的终结操作有:
forEach
:对每个元素执行给定的操作(比如打印)collect
:将流转换成其他形式(如集合、数组)reduce
:聚合流中的元素,比如求和、求最大值等count
:返回流中元素的个数anyMatch
/allMatch
/noneMatch
:判断流中的元素是否符合某个条件
使用示例
假设有一个包含若干整数的列表,我们可以通过 Stream
进行一系列的操作,比如过滤、映射和求和:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 过滤出偶数,乘以2,然后求和
int sum = numbers.stream()
.filter(n -> n % 2 == 0) // 中间操作:过滤偶数
.map(n -> n * 2) // 中间操作:将每个元素乘以2
.reduce(0, Integer::sum); // 终结操作:求和
System.out.println("Sum: " + sum); // 输出结果:Sum: 60
}
}
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 过滤出偶数,乘以2,然后求和
int sum = numbers.stream()
.filter(n -> n % 2 == 0) // 中间操作:过滤偶数
.map(n -> n * 2) // 中间操作:将每个元素乘以2
.reduce(0, Integer::sum); // 终结操作:求和
System.out.println("Sum: " + sum); // 输出结果:Sum: 60
}
}
Stream的常见来源
Stream
可以从多种数据源创建:
- 集合:如
List
和Set
,调用stream()
方法 - 数组:可以使用
Arrays.stream()
方法 - 文件:通过
Files.lines()
读取文件的每一行并转换为流 - 生成:如
Stream.of()
直接生成一个流 - 无限流:通过
Stream.iterate()
或Stream.generate()
生成一个无限的流
总结
Stream
流是一种用于处理数据的强大工具,能让代码更简洁、更具可读性,同时还提升了性能。通过 Stream
,我们可以以声明式的方式操作数据,而不用编写繁琐的迭代代码。