在 Java 中,Stream
是处理集合数据的抽象概念。Stream
提供了一种在一组数据集合上进行声明式操作的方法。Stream
API 支持串行和并行处理。
以下是 Stream
的主要种类及用法介绍:
1. 基本 Stream
接口
Stream<T>
: 通用的泛型接口,适用于任意引用类型。
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
2. IntStream
、LongStream
和 DoubleStream
IntStream
: 用于处理基本类型int
的流。
IntStream intStream = IntStream.range(1, 5);
LongStream
: 用于处理基本类型long
的流。
LongStream longStream = LongStream.range(1, 5);
DoubleStream
: 用于处理基本类型double
的流。
DoubleStream doubleStream = DoubleStream.of(1.0, 2.0, 3.0);
3. Stream
的创建方式
- 通过集合创建:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
- 通过数组创建:
String[] array = {"a", "b", "c"};
Stream<String> streamFromArray = Arrays.stream(array);
- 通过
Stream.of()
创建:
Stream<String> streamOfValues = Stream.of("a", "b", "c");
- 使用
Stream.iterate()
创建无限流:
Stream.iterate(0, n -> n + 2).limit(5).forEach(System.out::println);
4. Stream
的中间操作
filter
: 用于过滤元素。
List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
map
: 用于对每个元素应用一个函数。
List<Integer> lengths = list.stream().map(String::length).collect(Collectors.toList());
sorted
: 用于对流进行排序。
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
distinct
: 用于去重。
List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
5. Stream
的终端操作
collect
: 将流中的元素收集到一个集合中。
List<String> collectedList = list.stream().collect(Collectors.toList());
forEach
: 对流中的每个元素执行指定操作。
list.stream().forEach(System.out::println);
reduce
: 根据给定的规约函数对流的元素进行处理。
Optional<String> concatenated = list.stream().reduce((s1, s2) -> s1 + s2);
count
: 返回流中元素的数量。
long count = list.stream().count();
- **
match
:**用于检查流中的元素是否满足指定的条件。
有三个相关的操作:
allMatch
:检查是否所有元素都满足条件。
anyMatch
:检查是否至少有一个元素满足条件。
noneMatch
:检查是否所有元素都不满足条件。
6. Stream
的并行处理
流可以很容易地切换为并行流以提高处理速度。例如:
List<Integer> parallelSquaredNumbers = numbers.parallelStream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());