首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 流 (Stream) 详解

Java 流 (Stream) 详解

作者头像
艾伦耶格尔
发布2025-08-28 14:07:35
发布2025-08-28 14:07:35
1890
举报
文章被收录于专栏:Java基础Java基础

欢迎来到 Java 流 (Stream) 深入讲解,在处理大量数据时,Java 流 (Stream) 可以帮助你更简洁、高效地处理数据。

1. Stream API 简介

  • 概念: Stream 是一个数据处理管道,可以将数据进行过滤、排序、转换等操作。
  • 优势:
    • 简洁: 使用流可以写出更简洁的代码。
    • 高效: 流可以并行处理数据,提高性能。
    • 可读性: 流的代码更易于理解。

2. 创建 Stream

  • 从集合创建:
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Stream<String> stream = names.stream();
  • 从数组创建:
代码语言:javascript
复制
String[] names = {"Alice", "Bob", "Charlie", "David"};
Stream<String> stream = Arrays.stream(names);
  • 使用 Stream.of():
代码语言:javascript
复制
Stream<String> stream = Stream.of("Alice", "Bob", "Charlie", "David");

3. Stream 操作

3.1 中间操作: 不产生结果,返回新的 Stream。

  • filter: 过滤元素。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> longNames = names.stream()
    .filter(name -> name.length() > 4)
    .collect(Collectors.toList());
  • limit: 获取前 n 个元素。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> firstTwoNames = names.stream()
    .limit(2)
    .collect(Collectors.toList());
  • skip: 跳过前 n 个元素。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> lastTwoNames = names.stream()
    .skip(2)
    .collect(Collectors.toList());
  • distinct: 去重。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Alice");
List<String> uniqueNames = names.stream()
    .distinct()
    .collect(Collectors.toList());
  • concat: 合并两个流。
代码语言:javascript
复制
Stream<String> stream1 = Stream.of("Alice", "Bob");
Stream<String> stream2 = Stream.of("Charlie", "David");
Stream<String> combinedStream = Stream.concat(stream1, stream2);
  • map: 转换元素。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<Integer> lengths = names.stream()
    .map(String::length)
    .collect(Collectors.toList());

3.2 终结操作: 产生结果。

  • forEach: 遍历元素。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
names.stream().forEach(System.out::println);
  • count: 统计元素个数。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
long count = names.stream().count();
  • toArray: 收集元素到数组。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
String[] namesArray = names.stream().toArray(String[]::new);
  • collect: 收集元素到集合。
代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> upperCaseNames = names.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

4. Stream 的练习 

示例 1: 处理和筛选数字列表

这个示例展示了如何使用流的中间方法(如 filter 和 map)和终结方法(如 collect 和 forEach)来处理和筛选数字列表。

代码语言:javascript
复制
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamDemo1 {
    public static void main(String[] args) {
        // 创建一个整数列表
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 使用流的中间方法和终结方法处理数据
        List<Integer> result = numbers.stream()  // 创建流
            .filter(n -> n % 2 == 0)             // 中间方法: 过滤出偶数
            .map(n -> n * n)                    // 中间方法: 计算每个偶数的平方
            .collect(Collectors.toList());      // 终结方法: 将结果收集到列表中

        // 打印结果
        System.out.println("偶数的平方: " + result);

        // 使用流的终结方法直接输出
        System.out.println("偶数的平方(直接输出):");
        numbers.stream()
            .filter(n -> n % 2 == 0)             // 中间方法: 过滤出偶数
            .map(n -> n * n)                    // 中间方法: 计算每个偶数的平方
            .forEach(System.out::println);     // 终结方法: 直接输出每个平方
    }
}

解释:

  • numbers.stream():将列表转换为流。
  • filter(n -> n % 2 == 0):中间方法,筛选出偶数。
  • map(n -> n * n):中间方法,将每个偶数映射为它的平方。
  • collect(Collectors.toList()):终结方法,将处理结果收集到新的列表中。
  • forEach(System.out::println):终结方法,直接打印每个平方值。

示例 2: 处理员工数据

这个示例展示了如何使用流的中间方法(如 sorted 和 distinct)和终结方法(如 count 和 toList)来处理员工数据列表。

代码语言:javascript
复制
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamDemo2 {
    public static void main(String[] args) {
        // 创建一个员工数据列表
        List<String> employees = Arrays.asList(
            "Alice", "Bob", "Charlie", "Alice", "David", "Bob", "Eve");

        // 使用流的中间方法和终结方法处理数据
        long uniqueCount = employees.stream()       // 创建流
            .distinct()                           // 中间方法: 去重
            .sorted()                             // 中间方法: 排序
            .peek(System.out::println)            // 中间方法: 打印每个元素(调试用)
            .count();                             // 终结方法: 计算去重后元素的数量

        // 打印去重后的员工名称
        System.out.println("去重后的员工名称:");
        List<String> sortedUniqueEmployees = employees.stream()
            .distinct()                           // 中间方法: 去重
            .sorted()                             // 中间方法: 排序
            .collect(Collectors.toList());        // 终结方法: 将结果收集到列表中

        // 打印结果
        System.out.println(sortedUniqueEmployees);
        System.out.println("去重后的员工数量: " + uniqueCount);
    }
}

解释:

  • employees.stream():将列表转换为流。
  • distinct():中间方法,去除重复的元素。
  • sorted():中间方法,对元素进行排序。
  • peek(System.out::println):中间方法,用于调试,打印流中的每个元素。
  • count():终结方法,计算流中元素的数量。
  • collect(Collectors.toList()):终结方法,将处理结果收集到新的列表中。

结语:Java 流可以帮助你更简洁、高效地处理数据,以上就是关于其的讲解,希望对各位看官有所帮助,感谢各位看官的观看,下期见,谢谢~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Stream API 简介
  • 2. 创建 Stream
  • 3. Stream 操作
    • 3.1 中间操作: 不产生结果,返回新的 Stream。
    • 3.2 终结操作: 产生结果。
  • 4. Stream 的练习 
    • 示例 1: 处理和筛选数字列表
    • 示例 2: 处理员工数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档