Java的Stream流:文件处理、排序与串并行流的全面指南

Java的Stream流:文件处理、排序与串并行流的全面指南

Java 8 引入了 Stream API,这是一个用于处理集合数据的强大工具,它提供了一种声明式的方式来进行聚合操作。Stream 不是一个数据结构,而是一种对数据进行操作的抽象,允许开发者以一种更简洁、易读的方式来表达复杂的查询逻辑。下面我们将详细介绍 Java Stream 的概念、特性以及如何使用它。

1 Stream 的基本概念

Stream 是一个来自源的数据元素序列,支持顺序和并行聚合操作。它可以看作是高级版本的 Iterator,但是与 Iterator 不同的是,Stream 操作可以链式调用,从而形成一系列的操作流水线。此外,Stream 的操作不会修改源数据,而是生成新的结果。

1.2 Stream 的创建

创建 Stream 有多种方式:

  • 从集合创建:大多数集合类都提供了 stream()parallelStream() 方法来创建串行流或并行流。
  • 通过静态方法创建Stream.of() 可以接受不定数量的参数来创建流;Stream.generate()Stream.iterate() 可以生成无限流,通常需要结合 limit() 来限制大小。
  • 从数组创建:可以通过 Arrays.stream(array) 或者直接调用数组上的 stream() 方法来创建流。
  • 文件读取BufferedReader.lines() 可以将文件的每一行转换成流中的元素。
  • 正则表达式分割字符串Pattern.splitAsStream() 可以根据指定的分隔符将字符串拆分成流。
1.3 中间操作

中间操作是指那些返回另一个 Stream 的操作,它们本身不会触发任何计算,只有当终端操作被执行时才会真正开始处理数据。常见的中间操作包括:

  • filter:过滤掉不符合条件的元素。
  • map:对每个元素应用一个函数,并返回一个新的 Stream。
  • flatMap:对每个元素应用一个函数,该函数返回一个 Stream,然后将所有这些 Stream 扁平化为一个单独的 Stream。
  • distinct:去除重复元素。
  • sorted:对元素排序,可以选择自然排序或自定义比较器。
  • peek:对每个元素执行副作用操作(如打印),但不改变流的内容。
1.4 终端操作

一旦执行了终端操作,Stream 就会被消耗掉,不能再被使用。常见的终端操作有:

  • forEach:遍历流中的每一个元素。
  • collect:将流中的元素收集到集合中,如 List 或 Set。
  • reduce:通过某种方式减少流中的元素,例如求和或乘积。
  • count:统计流中元素的数量。
  • min/max:找到最小值/最大值。
  • anyMatch/allMatch/noneMatch:检查是否至少有一个/所有/没有元素满足给定的谓词。

2 基本使用示例

示例1 筛选大于等于 10 的整数
List<Integer> numbers = Arrays.asList(5, 10, 15, 20, 25, 30);
numbers.stream()
       .filter(num -> num >= 10)
       .forEach(System.out::println);

这段代码会输出 10, 15, 20, 25, 30,因为这些都是大于等于 10 的数字。

示例2 提取员工姓名
List<Employee> employees = Arrays.asList(
        new Employee("Alice", 25),
        new Employee("Bob", 30),
        new Employee("Charlie", 35)
);
employees.stream()
         .map(Employee::getName)
         .forEach(System.out::println);

这里我们使用 map 操作提取了每个员工的名字,并打印出来。

示例3 去重
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 2, 3, 5, 1, 6

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