Java 中如何使用 Stream API?

简介: Java 中如何使用 Stream API?

什么是 Stream API?


Stream API 是 Java 8 中引入的一项新特性,它提供了一种函数式的、流式处理集合数据的方式。Stream API 可以让我们以更简洁、更易读的方式处理集合数据,同时还可以充分利用多核 CPU 的并行处理能力,提高程序的执行效率。


在 Stream API 中,我们可以通过一系列的操作对集合数据进行处理,这些操作可以分为中间操作和终止操作。中间操作是对流的数据进行处理和转换,但不会产生最终的结果;终止操作是产生最终结果的操作,它会触发流的处理,并将结果返回。


Stream API 主要包含以下几个部分:


  • 流的创建:通过集合、数组、文件等方式创建流。
  • 操作流:对流进行过滤、映射、排序、去重等操作。
  • 终止流:将流转换为集合、数组、汇总统计、匹配检查等。


下面我们将详细介绍 Java 中如何使用 Stream API。


image.png


Java 中如何使用 Stream API?


流的创建


在 Java 中,我们可以通过多种方式创建流。以下是一些常用的流的创建方式:


从集合创建流

List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream();

从数组创建流

int[] array = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array);

从文件创建流

Path path = Paths.get("file.txt");
Stream<String> stream = Files.lines(path);

从函数创建流

Stream.generate(() -> "hello")
      .limit(5)
      .forEach(System.out::println);

在上面的代码中,我们使用 Stream.generate() 方法创建了一个无限流,该流会不断生成字符串 “hello”,然后使用 limit() 方法对流进行截取,最终输出前 5 个元素。


操作流


在创建了流之后,我们可以对流进行一系列的操作,以实现数据的处理和转换。以下是一些常用的流操作:


filter() 方法


filter() 方法可以对流中的数据进行过滤,只保留符合条件的数据,从而得到一个新的流。


List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));

上面的代码中,我们使用 filter() 方法过滤出以 “a” 开头的字符串,得到一个新的流。


map() 方法


map() 方法可以对流中的数据进行转换,从而得到一个新的流。


List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream().map(String::toUpperCase);

上面的代码中,我们使用 map() 方法将字符串转换成大写形式,得到一个新的流。


sorted() 方法


sorted() 方法可以对流中的数据进行排序,从而得到一个新的流。


List<String> list = Arrays.asList("b", "a", "d", "c");
Stream<String> stream = list.stream().sorted();

上面的代码中,我们使用 sorted() 方法对字符串进行排序,得到一个新的流。


distinct() 方法


distinct() 方法可以对流中的数据进行去重,从而得到一个新的流。


List<String> list = Arrays.asList("a", "b", "a", "c");
Stream<String> stream = list.stream().distinct();

上面的代码中,我们使用 distinct() 方法对字符串进行去重,得到一个新的流。


peek() 方法


peek() 方法可以对流中的数据进行操作,不会改变流中的数据,但可以在操作过程中输出一些信息。

List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> stream = list.stream().peek(System.out::println);


上面的代码中,我们使用 peek() 方法对字符串进行操作,并输出字符串的值,但不会改变流中的数据。


终止流


在对流进行了操作之后,我们可以通过终止操作将流转换为最终的结果。以下是一些常用的终止操作:


collect() 方法


collect() 方法可以将流中的元素收集到一个集合中,如 List、Set、Map 等。


List<String> list = Arrays.asList("a", "b", "c", "d");
List<String> result = list.stream().collect(Collectors.toList());

上面的代码中,我们使用 collect() 方法将流中的元素收集到一个 List 中。


reduce() 方法


reduce() 方法可以对流中的元素进行累加、求和等操作,得到一个最终的结果。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, Integer::sum);

上面的代码中,我们使用 reduce() 方法对整数进行求和操作,并得到最终的结果。


count() 方法


count() 方法可以统计流中的元素个数。


List<String> list = Arrays.asList("a", "b", "c", "d");
long count = list.stream().count();

上面的代码中,我们使用 count() 方法统计了流中的元素个数。


forEach() 方法


forEach() 方法可以对流中的每个元素进行操作,如输出到控制台等。


List<String> list = Arrays.asList("a", "b", "c", "d");
list.stream().forEach(System.out::println);

上面的代码中,我们使用 forEach() 方法输出了流中的每个元素。


完整示例代码


下面是一个完整的示例代码,演示了如何使用 Stream API 对集合中的数据进行操作。


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamDemo {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("hello", "world", "java", "stream", "api");
        // 过滤出长度大于 4 的字符串,并将其转换成大写形式
        List<String> result = list.stream()
                .filter(s -> s.length() > 4)
                .map(String::toUpperCase)
                .collect(Collectors.toList());
        System.out.println(result);
        // 统计字符串的个数
        long count = list.stream().count();
        System.out.println(count);
        // 对字符串进行排序,并输出到控制台
        list.stream().sorted().forEach(System.out::println);
        // 对字符串进行去重,并输出到控制台
        list.stream().distinct().forEach(System.out::println);
        // 对字符串进行操作,并输出到控制台
        list.stream().peek(System.out::println).collect(Collectors.toList());
    }
}

以上代码演示了如何使用 Stream API 对集合中的数据进行操作,并输出结果到控制台。


总结


Stream API 是 Java 8 中引入的一项新特性,它提供了一种函数式的、流式处理集合数据的方式。Stream API 可以让我们以更简洁、更易读的方式处理集合数据,同时还可以充分利用多核 CPU 的并行处理能力,提高程序的执行效率。在使用 Stream API 时,我们可以通过一系列的操作对集合数据进行处理,这些操作可以分为中间操作和终止操作。中间操作是对流的数据进行处理和转换,但不会产生最终的结果;终止操作是产生最终结果的操作,它会触发流的处理,并将结果返回。通过使用 Stream API,我们可以更方便地进行集合数据的处理和转换,提高程序的可读性和可维护性。


相关文章
|
12月前
|
Java API
详细解释一下Stream API中的sorted操作
详细解释一下Stream API中的sorted操作
769 1
|
12月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
660 114
|
12月前
|
Java API
深入理解Java Stream API:告别繁琐循环
深入理解Java Stream API:告别繁琐循环
429 104
|
12月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
425 1
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
485 100
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
455 101
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
563 101
|
SQL 存储 JSON
ElasticSearch 查询与 Java API 实践(下)
ElasticSearch 查询与 Java API 实践
1534 0
ElasticSearch 查询与 Java API 实践(下)
|
存储 Java 数据建模
ElasticSearch 查询与 Java API 实践(中)
ElasticSearch 查询与 Java API 实践
595 0
ElasticSearch 查询与 Java API 实践(中)