当前位置: 首页 > backend >正文

Stream流

在Java中,Stream流是Java 8引入的一个强大的功能,它提供了一种高效且声明式的方式来处理集合数据。Stream并不是一个数据结构,而是一个数据处理的抽象概念,它允许你以声明式的方式对集合进行操作,例如过滤、排序、转换和聚合等。

Stream 的特点
1. **声明式**:Stream 提供了声明式的方式来处理数据,代码更加简洁易读。
2. **链式调用**:Stream 的操作可以链式调用,形成一个操作流水线。
3. **并行支持**:Stream 提供了并行处理的能力,可以轻松地将单线程操作转换为多线程操作。
4. **惰性求值**:Stream 的操作是惰性求值的,只有在需要时才会执行。

Stream 的主要操作
Stream 的操作可以分为两类:
1. **中间操作(Intermediate Operations)**:返回一个新的 Stream,用于进一步操作。例如:
   - `filter`:过滤元素。
   - `map`:转换元素。
   - `sorted`:排序。
   - `distinct`:去重。
2. **终端操作(Terminal Operations)**:返回一个结果或副作用,结束 Stream 的操作。例如:
   - `forEach`:遍历元素。
   - `collect`:收集结果。
   - `sum`、`max`、`min`、`count`:聚合操作。

### 日常工作中如何使用 Stream

1. 过滤和转换数据
Stream 提供了非常方便的方式来过滤和转换数据。例如,从一个列表中筛选出符合条件的元素,并对它们进行操作。

筛选出偶数并平方

import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 筛选出偶数并平方List<Integer> result = numbers.stream().filter(n -> n % 2 == 0) // 筛选出偶数.map(n -> n * n)         // 平方.collect(Collectors.toList()); // 收集结果System.out.println(result); // 输出:[4, 16]}
}

2. 数据聚合
Stream 提供了多种聚合操作,例如求和、最大值、最小值、计数等。

计算列表中所有偶数的和

import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 计算所有偶数的和int sum = numbers.stream().filter(n -> n % 2 == 0) // 筛选出偶数.mapToInt(Integer::intValue) // 转换为 int 类型.sum(); // 求和System.out.println(sum); // 输出:6}
}

3. 数据排序
Stream 提供了 `sorted` 方法,可以方便地对数据进行排序。

对列表进行排序

import java.util.Arras;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(5, 2, 3, 1, 4);// 对列表进行排序List<Integer> sortedNumbers = numbers.stream().sorted() // 排序.collect(Collectors.toList()); // 收集结果System.out.println(sortedNumbers); // 输出:[1, 2, 3, 4, 5]}
}

4. 数据去重
Stream 提供了 `distinct` 方法,可以方便地去除重复元素。

去除列表中的重复元素

import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);// 去除重复元素List<Integer> uniqueNumbers = numbers.stream().distinct() // 去重.collect(Collectors.toList()); // 收集结果System.out.println(uniqueNumbers); // 输出:[1, 2, 3, 4, 5]}
}

5. 并行处理
Stream 提供了并行处理的能力,可以通过 `parallelStream` 方法将单线程操作转换为多线程操作。

并行计算列表中所有偶数的和

import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 并行计算所有偶数的和int sum = numbers.parallelStream() // 使用并行流.filter(n -> n % 2 == 0) // 筛选出偶数.mapToInt(Integer::intValue) // 转换为 int 类型.sum(); // 求和System.out.println(sum); // 输出:30}
}

6. 数据分组
Stream 提供了 `Collectors.groupingBy` 方法,可以方便地对数据进行分组。

按奇偶性对列表进行分组

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 按奇偶性分组Map<Boolean, List<Integer>> groupedNumbers = numbers.stream().collect(Collectors.groupingBy(n -> n % 2 == 0)); // 分组System.out.println(groupedNumbers); // 输出:{false=[1, 3, 5], true=[2, 4, 6]}}
}

总结
Stream 提供了一种高效且声明式的方式来处理集合数据,能够显著简化代码并提高开发效率。在日常工作中,你可以通过以下方式使用 Stream:
1. **过滤和转换数据**:使用 `filter`、`map` 等方法。
2. **数据聚合**:使用 `sum`、`max`、`min`、`count` 等方法。
3. **数据排序**:使用 `sorted` 方法。
4. **数据去重**:使用 `distinct` 方法。
5. **并行处理**:使用 `parallelStream` 方法。
6. **数据分组**:使用 `Collectors.groupingBy` 方法。

Stream 的强大之处在于它的声明式语法和链式调用,使得代码更加简洁易读。同时,Stream 的并行处理能力也使得它在处理大规模数据时更加高效。

http://www.xdnf.cn/news/5409.html

相关文章:

  • 一周内学完计算机网络课程之二:计算机网络物理层的理解
  • STM32智能窗帘系统:从零到一的开发实战
  • 如何租用服务器并通过ssh连接远程服务器终端
  • 【计算机网络01】 网络组成与三种交换方式
  • Web 实时通信技术:WebSocket 与 Server-Sent Events (SSE) 深入解析
  • 【RAG】11种Chunking Strategies分块策略介绍和选择
  • VirtualBox中安装并运行ubuntu-24.04.2-desktop虚拟机
  • Linux基础整理
  • Docker Compose 完全指南:从入门到生产实践
  • java的Stream流处理
  • 数据库事务以及JDBC实现事务
  • 模型欠拟合是什么?
  • 基于VSCode + PlatformIO平台的ESP8266的DS1302实时时钟
  • AI日报 · 2025年05月11日|传闻 OpenAI 考虑推出 ChatGPT “永久”订阅模式
  • Linux中常见开发工具简单介绍
  • 05.three官方示例+编辑器+AI快速学习three.js webgl - animation - skinning - ik
  • Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
  • MySql(进阶)
  • 【大模型】AI智能体Coze 知识库从使用到实战详解
  • 基于Dify实现对Excel的数据分析
  • 嵌入式硬件篇---陀螺仪|PID
  • Linux之进程概念
  • 电源架构与太阳能充电器电路设计分析
  • OpenWrt开发第8篇:树莓派开发板做无线接入点
  • langchain 接入国内搜索api——百度AI搜索
  • Qt 样式表:全面解析与应用指南
  • LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?
  • 理解 Token 索引 vs 字符位置
  • C++23 新特性:深入解析 std::views::join_with(P2441R2)
  • 深入解析 Vision Transformer (ViT) 与其在计算机视觉中的应用