Java Stream API 是 Java 8 引入的一个核心特性,它提供了一种高效、声明式的方式来处理数据集合(如 List、Set)。Stream API 可以让你以声明式方式处理数据集合(通过查询/映射/归约等操作),它关注于做什么而不是怎么做。下面详细介绍 Java Stream API 的一些基本用法。
1. 创建 Stream
- 从集合创建:可以通过
Collection.stream()
或Collection.parallelStream()
来获取一个流。 - 从数组创建:使用
Arrays.stream(T[] array)
或Stream.of(T... values)
。 - 从值创建:使用
Stream.of(T t)
或Stream.empty()
。 - 从文件或生成器:使用
Files.lines(Path path)
或IntStream.generate(Supplier<Integer> s)
。
2. 中间操作
中间操作返回一个新的流,并且可以是惰性的(即操作仅在需要结果时才执行)。
- 过滤:
filter(Predicate<? super T> predicate)
- 映射:
map(Function<? super T, ? extends R> mapper)
- 排序:
sorted()
或sorted(Comparator<? super T> comparator)
- 去重:
distinct()
- 截取:
limit(long maxSize)
- 跳过:
skip(long n)
3. 终端操作
终端操作会处理流并产生结果,一旦调用终端操作,流就会被消费,无法再次使用。
- 收集:
collect(Collectors.toList())
或其他收集器 - 归约:
reduce(BinaryOperator<T> accumulator)
- 匹配:
anyMatch(Predicate<? super T> predicate)
、allMatch(Predicate<? super T> predicate)
、noneMatch(Predicate<? super T> predicate)
- 查找:
findFirst()
、findAny()
- 迭代:
forEach(Consumer<? super T> action)
- 最大值/最小值:
max(Comparator<? super T> comparator)
、min(Comparator<? super T> comparator)
4. 并行流
Java Stream API 还支持并行流,允许你利用多核处理器来并行处理数据。你可以通过调用 Collection.parallelStream()
来获取一个并行流。然而,并非所有的操作都能有效地并行化,且并行流可能会引入额外的线程开销。因此,在决定使用并行流之前,你应该评估你的应用场景。