Stream流的介绍

197 阅读2分钟

Stream 流是 Java 8 引入的一种新特性,它允许你以声明性方式处理集合数据(如列表、集合等),提供了更简洁和功能强大的方式来操作数据。Stream 流的主要特点是能够处理数据序列,并支持函数式编程风格的操作。

1. Stream 的基本概念

  • Stream:表示一个序列化的数据流,可以从集合、数组或 I/O 通道等中获取。
  • 操作:Stream 提供了多种操作,包括过滤、映射、排序、聚合等。
  • 惰性求值:Stream 操作通常是惰性执行的,意味着只有在需要结果时才会计算。
  • 无存储:Stream 本身不存储数据,而是从数据源中动态计算数据。

2. Stream 的语法

Stream 操作通常分为两个阶段:创建和操作。

2.1 创建 Stream

你可以通过以下方式创建 Stream:

  • 从集合创建:

    List<String> list = Arrays.asList("a", "b", "c");
    Stream<String> stream = list.stream();
    
  • 从数组创建:

    String[] array = {"a", "b", "c"};
    Stream<String> stream = Arrays.stream(array);
    
  • 使用 Stream.of():

    Stream<String> stream = Stream.of("a", "b", "c");
    

2.2 常用操作

Stream 支持许多操作,分为中间操作和终止操作。

中间操作

中间操作返回一个新的 Stream,通常是惰性求值。

  • filter:过滤符合条件的元素。

    Stream<String> filtered = stream.filter(s -> s.startsWith("a"));
    
  • map:将每个元素转换为另一种形式。

    Stream<Integer> lengths = stream.map(String::length);
    
  • sorted:对元素进行排序。

    Stream<String> sorted = stream.sorted();
    
终止操作

终止操作会触发实际的计算,并返回结果。

  • forEach:对每个元素执行操作。

    stream.forEach(System.out::println);
    
  • collect:将 Stream 中的元素收集到集合中。

    List<String> result = stream.collect(Collectors.toList());
    
  • reduce:对元素进行聚合。

    Optional<String> concatenated = stream.reduce((s1, s2) -> s1 + s2);
    

3. 使用示例

下面是一个简单的示例,演示如何使用 Stream 流:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 过滤以 'A' 开头的名字,并转换为大写
        List<String> filteredNames = names.stream()
            .filter(name -> name.startsWith("A"))
            .map(String::toUpperCase)
            .collect(Collectors.toList());

        // 打印结果
        filteredNames.forEach(System.out::println);
    }
}

4. 总结

  • Stream 是一种用于处理数据序列的 API,支持函数式编程风格。
  • 它提供了多种操作,如过滤、映射、排序等,具有惰性求值的特性。
  • Stream 操作通常分为中间操作和终止操作,中间操作返回新的 Stream,终止操作执行计算并返回结果。

使用 Stream 可以使代码更加简洁和可读,同时提高了处理集合数据的效率。