Java 8 中 Stream 常用操作及代码示例详解

1. 简介

Java 8 引入了 Stream API,它是一种新的抽象概念,用于以更简洁、更具表现力的方式处理集合和数组数据。本文将详细介绍 Java 8 中 Stream 的常用操作,并提供多个示例代码,帮助您更好地理解和使用 Stream。

2. Stream 概述

Stream 是 Java 8 引入的一个功能强大的数据处理工具,它提供了一种函数式编程的方式来操作集合和数组数据。Stream 可以支持各种数据处理操作,如过滤、映射、排序、聚合等。

3. 创建 Stream

在使用 Stream 前,需要先将数据源转换为 Stream 对象。常见的创建 Stream 的方式有以下几种:

  • 通过集合的 stream() 方法创建 Stream。
  • 通过数组的 Arrays.stream() 方法创建 Stream。
  • 通过 Stream.of() 方法创建 Stream。
  • 通过 Stream.builder() 方法手动构建 Stream。

4. Stream 常用操作

4.1 过滤操作

过滤操作用于根据指定的条件过滤出满足条件的元素。常用的过滤操作有 filter()distinct()

4.2 映射操作

映射操作用于将每个元素映射为另一个元素。常用的映射操作有 map()flatMap()

4.3 排序操作

排序操作用于对元素进行排序。常用的排序操作有 sorted()

4.4 聚合操作

聚合操作用于对元素进行统计或计算。常用的聚合操作有 count()sum()min()max()average()

4.5 匹配操作

匹配操作用

于判断流中的元素是否满足指定条件。常用的匹配操作有 anyMatch()allMatch()noneMatch()

4.6 截断操作

截断操作用于对流进行截断,获取指定数量的元素。常用的截断操作有 findFirst()limit()

5. 终端操作

终端操作用于触发流的计算,并生成最终结果。常用的终端操作有 forEach()collect()count()reduce()

5.1 forEach

forEach 用于对流中的每个元素执行指定的操作。

5.2 collect

collect 用于将流中的元素收集到一个集合或其他数据结构中。除了 Java 集合类提供的收集器外,我们还可以使用 Collections 类中的一些方法进行收集。

6. 使用 Collections 的方法进行收集

Java 提供的 Collections 类中的一些方法可以方便地对 Stream 的元素进行收集,例如:

  • toList():将流中的元素收集到 List 中。
  • toSet():将流中的元素收集到 Set 中。
  • toMap():将流中的元素收集到 Map 中。

下面是使用 Collections 的方法进行收集的示例代码:

List<Integer> result1 = list.stream()
                            .filter(element -> element > 0)
                            .collect(Collectors.toList());

Set<Integer> result2 = list.stream()
                           .filter(element -> element > 0)
                           .collect(Collectors.toSet());

Map<Integer, String> result3 = list.stream()
                                    .collect(Collectors.toMap(
                                        element -> element,
                                        element -> String.valueOf(element),
                                        (v1, v2)-> v1
                                    ));

7. Stream 流的优缺点及适用场景

Stream 提供了一种简洁、可读性强的数据处理方式,但它也有一些优缺点和适用场景。

优点:

  • 函数式编程风格:Stream 使用函数式编程风格,使代码更简洁、可读性更强。
  • 惰性计算:Stream 的操作是惰性的,只有在终端操作时才会进行计算,提高了性能和效率。
  • 并行处理:Stream 可以支持并行处理,充分利用多核处理器的优势,提高处理速度。

缺点:

  • 学习成本:相比传统的循环和迭代方式,Stream 的学习成本较高。
  • 非线程安全:Stream 的操作是不可变的,不适用于多线程环境。

适用场景:

  • 数据处理和转换:Stream 可以方便地进行数据处理、转换和筛选。
  • 并行处理:对于大规模数据集或需要并行处理的场景,Stream 提供了并行操作的能力,提高了处理速度。

8. 示例代码

下面是一些示例代码,演示了 Stream 的常用操作的使用:

8.1 过滤

操作示例

List<Integer> result = list.stream()
                           .filter(element -> element > 0)
                           .collect(Collectors.toList());

8.2 映射操作示例

List<String> result = list.stream()
                          .map(String::valueOf)
                          .collect(Collectors.toList());

8.3 排序操作示例

List<Integer> result = list.stream()
                           .sorted()
                           .collect(Collectors.toList());

8.4 聚合操作示例

long count = list.stream()
                 .count();
int sum = list.stream()
              .mapToInt(Integer::intValue)
              .sum();
OptionalInt max = list.stream()
                      .mapToInt(Integer::intValue)
                      .max();

8.5 匹配操作示例

boolean anyMatch = list.stream()
                       .anyMatch(element -> element > 0);
boolean allMatch = list.stream()
                       .allMatch(element -> element > 0);
boolean noneMatch = list.stream()
                        .noneMatch(element -> element > 0);

8.6 截断操作示例

Optional<Integer> first = list.stream()
                              .findFirst();
List<Integer> result = list.stream()
                           .limit(5)
                           .collect(Collectors.toList());

9. 结论

本文详细介绍了 Java 8 中 Stream 的常用操作和终端操作,以及使用 Collections 的方法进行收集。同时,分析了 Stream 的优缺点和适用场景。通过学习和掌握这些操作,您可以更加高效和便捷地处理集合和数组数据。

10. 参考链接

  • Java 8 Stream API 官方文档

你可能感兴趣的:(Java,java,开发语言)