Java Streams API:方法、优势与示例 - Jade Global

作者:API传播员 · 2025-11-12 · 阅读时间:5分钟

Stream API 是 Java 8 中 Collections API 新增的重要功能。它表示一系列元素,并支持对集合进行多种操作(如筛选、排序、映射和收集)。通过将这些操作组合在一起,可以形成一个查询数据的管道,如下图所示:


Java 流的工作原理示例

理解 Java 流的最佳方式是将其想象为一个对象列表,这些对象彼此独立,一次一个地进入管道。开发者可以控制进入管道的对象数量、在管道内对它们执行的操作以及它们离开管道后的处理方式。

我们可以通过 .stream() 方法从集合中获取流。例如,假设我们有一个语言下拉列表,并希望使用 For 循环或 Stream API 打印该列表。


流 API 方法的使用

获取流并打印元素

通过调用集合上的 .stream() 方法,我们可以获取流。获取流后,可以调用 [forEach](https://www.explinks.com/blog/the-benefits-of-the-collection-api-in-java-8-part-1)() 方法,并传递一个操作来处理每个元素。例如,使用 System.out.println 方法打印每个元素的值。

List languages = new ArrayList();
languages.add("Java");
languages.add("Python");
languages.add("JavaScript");

languages.stream().forEach(System.out::println);

使用 filter() 方法过滤流

filter() 方法用于根据特定条件过滤流中的元素。例如,我们可以过滤出以 "E" 开头的语言:

languages.stream()
         .filter(item -> item.startsWith("E"))
         .forEach(System.out::println);

在这里,filter() 方法接收一个谓词(Predicate)作为参数,该谓词是一个返回布尔值的函数式接口。

使用 sort() 方法排序流

sort() 方法可以对流中的元素进行排序。例如,按字母顺序对语言列表进行排序:

languages.stream()
         .sorted()
         .forEach(System.out::println);

使用 map() 方法映射元素

map() 方法将流中的元素映射为另一个对象。例如,将语言列表中的所有元素转换为大写:

languages.stream()
         .map(String::toUpperCase)
         .forEach(System.out::println);

使用 collect() 方法收集结果

collect() 方法可以将流中的元素收集到一个集合中。例如,创建一个新的大写语言列表:

List upperCaseLanguages = languages.stream()
                                           .map(String::toUpperCase)
                                           .collect(Collectors.toList());

System.out.println(upperCaseLanguages);

使用 min() 和 max() 方法查找最值

min()max() 方法可以用来查找流中的最小值和最大值。例如,从数字流中获取最大值:

Optional maxNumber = Stream.of(1, 2, 3, 4, 5)
                                    .max(Comparator.comparing(Integer::valueOf));

maxNumber.ifPresent(System.out::println);

使用 count() 方法统计元素数量

count() 方法可以返回流中元素的数量。例如,统计以 "G" 开头的语言数量:

long count = languages.stream()
                      .filter(item -> item.startsWith("G"))
                      .count();

System.out.println(count);

在 Selenium WebDriver 中使用 Stream API

示例 1:过滤和计数 Web 元素

以下代码展示了如何使用 Stream API 过滤和计数 Web 元素:

List links = driver.findElements(By.tagName("a"));

long brokenLinksCount = links.stream()
                             .filter(link -> link.getAttribute("href") == null)
                             .count();System.out.println("断开的链接数量:" + brokenLinksCount);

示例 2:按排序顺序显示产品

以下代码展示了如何使用 Stream API 和 XPath 获取按排序顺序显示的产品标题:

List productItems = driver.findElements(By.xpath("//h2[@class='product-title']"));

productItems.stream()
            .map(WebElement::getText)
            .sorted()
            .forEach(System.out::println);

流 API 的优势

  1. 操作流水线:Stream API 通过操作流水线从源(如数据结构、数组、生成器函数或 I/O 通道)传递元素。
  2. 函数式编程:流操作是函数式的,操作结果不会修改源数据。例如,过滤操作会生成一个新的流,而不会影响原始集合。
  3. 一次性消费:流中的元素只能被访问一次。如果需要重新访问相同的源元素,则必须创建一个新流。

结论

本文介绍了 Java Stream API 的基本用法及其在 Selenium WebDriver 中的应用。通过结合 Lambda 表达式和 Stream API,可以以函数式编程的方式编写代码,从而提高代码的可读性和简洁性。此外,Stream API 在处理 Web 元素列表时非常高效,能够轻松实现数据的过滤、排序和收集。

原文链接: https://www.jadeglobal.com/blog/introduction-java-eight-stream-api