深入理解Java 8中的Stream API及其应用

news/2024/9/19 4:58:14/ 标签: python, windows, 运维

深入理解Java 8中的Stream API及其应用

随着Java 8的推出,Java语言引入了许多令人兴奋的新特性,其中最为引人注目的便是Stream API。Stream API 为我们提供了一种全新的集合操作方式,使得数据处理、转换和过滤变得更加简洁、高效。在本文中,我们将深入探讨Java 8中的Stream API,特别是filtermap等常用操作,并通过实际案例展示其强大的应用。

什么是Stream?

Stream 是一个元素序列,支持多种不同类型的操作来处理这些元素。与集合不同,Stream 并不存储数据,而是按需生成数据。它的操作可以分为两类:中间操作终端操作

  • 中间操作(Intermediate Operation):这些操作会返回一个新的Stream,例如filtermapsorted等。中间操作是惰性的,即它们不会立即执行,直到一个终端操作触发它们的执行。
  • 终端操作(Terminal Operation):这些操作会产生一个结果或者副作用,例如forEachcollectreduce等。终端操作执行后,Stream将不再可用。
如何创建Stream?

创建Stream的方式有多种,例如可以从集合、数组、值、文件等创建。

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");// 从集合创建 Stream
Stream<String> stream = myList.stream();// 从数组创建 Stream
Stream<String> streamFromArray = Stream.of("a1", "a2", "b1");// 从数值范围创建 Stream
IntStream intStream = IntStream.range(1, 5);// 从文件创建 Stream
Stream<String> lines = Files.lines(Paths.get("file.txt"));

这些创建方法非常灵活,使得我们可以根据不同的需求轻松地获得Stream

Stream 中的常用操作
1. filter

filter 操作用于过滤掉不符合条件的元素,只保留满足条件的元素。它接受一个Predicate接口的实现,作为过滤条件。

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");myList.stream().filter(s -> s.startsWith("c")).forEach(System.out::println);  // 输出: c2, c1

在这个例子中,filter 操作筛选出了以"c"开头的字符串。

2. map

map 操作用于将流中的每个元素映射成另一个元素。它接收一个Function接口的实现,用于定义映射规则。

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");myList.stream().map(String::toUpperCase).forEach(System.out::println);  // 输出: A1, A2, B1, C2, C1

在这个例子中,map 操作将所有字符串转换为大写形式。

3. sorted

sorted 操作用于对流中的元素进行排序。它可以使用自然排序,也可以接受一个自定义的比较器。

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");myList.stream().sorted().forEach(System.out::println);  // 输出: a1, a2, b1, c1, c2

以上代码将字符串按照自然顺序排序。

4. collect

collect 是一个终端操作,用于将流中的元素收集到集合、数组或其他结果容器中。它通常结合Collectors类使用。

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");List<String> filteredList = myList.stream().filter(s -> s.startsWith("c")).collect(Collectors.toList());System.out.println(filteredList);  // 输出: [c2, c1]

在这个例子中,collect 操作将筛选后的结果收集到一个新的列表中。

5. forEach

forEach 是一个终端操作,用于对流中的每个元素执行给定的操作。它常用于打印或处理元素。

myList.stream().map(String::toUpperCase).forEach(System.out::println);  // 输出: A1, A2, B1, C2, C1
6. reduce

reduce 操作用于将流中的元素组合成一个值。它适用于求和、求积或字符串连接等操作。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.stream().reduce(0, Integer::sum);System.out.println(sum);  // 输出: 15

在这个例子中,reduce 操作用于对列表中的整数求和。

实际应用案例
案例1:处理用户数据

假设我们有一个用户对象的列表,我们需要找到所有年龄大于18岁且名字以"A"开头的用户,并按名字排序。

class User {String name;int age;User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name + " (" + age + ")";}
}List<User> users = Arrays.asList(new User("Alice", 23),new User("Bob", 20),new User("Charlie", 17),new User("Anna", 21)
);List<User> result = users.stream().filter(user -> user.age > 18).filter(user -> user.name.startsWith("A")).sorted(Comparator.comparing(user -> user.name)).collect(Collectors.toList());result.forEach(System.out::println);  // 输出: Alice (23), Anna (21)

在这个示例中,我们结合使用了filtersortedcollect操作,轻松实现了复杂的数据筛选和排序功能。

案例2:统计字符长度

如果我们有一组字符串,需要计算所有字符串的总长度,可以使用以下代码:

List<String> words = Arrays.asList("Java", "Stream", "API");int totalLength = words.stream().mapToInt(String::length).sum();System.out.println(totalLength);  // 输出: 14

这个例子展示了如何利用mapToIntsum方法计算字符串的总长度。

总结

Java 8 的Stream API为我们提供了一种简洁、强大且灵活的方式来处理集合。通过filtermapsortedcollect等操作,我们可以轻松完成各种复杂的数据处理任务,同时提高代码的可读性。Stream API不仅简化了我们对数据的操作,更是开启了函数式编程在Java中的大门。

Stream API 是Java 8引入的众多新特性中的一颗明珠,它为Java开发者提供了一个强大的工具来编写更加简洁、优雅和高效的代码。如果你还没有深入使用过Stream,不妨尝试一下,它将极大地改变你的编码方式和思维模式。


http://www.ppmy.cn/news/1520599.html

相关文章

收藏夹里的“小网站”被误报违规不让上怎么办?如何将Chrome和Edge安装到 D 盘(含用户数据),重装系统也不会丢失收藏夹和密码?

当你用国产浏览器访问网站的时候&#xff0c;有时候会显示这个&#xff1a; 如果确实是违规网站&#xff0c;不让访问也没什么&#xff0c;但是很多都是误报啊&#xff0c;你这样直接来个大红横幅&#xff0c;还让人活不&#xff1f; 那遇到这种误报应当怎么办呢&#xff1f;有…

新电脑Win11系统想要降级为Win10怎么操作?

前言 现在的电脑大部分都是Windows 11系统&#xff0c;组装机还好一些&#xff0c;如果想要使用Windows 10&#xff0c;只需要在安装系统的时候选择Windows 10镜像即可。 但是对于新笔记本、厂商的成品机、一体机来说&#xff0c;只要是全新的电脑&#xff0c;基本上都是Wind…

性能优化:自动化处理系统设计

性能优化&#xff1a;自动化处理系统设计 前言需求分析系统设计1. 调度中心2. 任务执行器3. 错误处理机制4. 通知系统5. 报表生成器6. 日志记录器 技术实现结语 前言 在当今这个信息爆炸、技术日新月异的时代&#xff0c;企业面临着前所未有的挑战和机遇。随着业务量的不断增长…

ArcGIS的8个“合并”功能要分清——矢量:编辑器合并,复制粘贴,工具合并、追加、联合——栅格:镶嵌、镶嵌至新栅

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 今天来看看ArcGIS中的几个涉及“合并”功能的用法。 对矢量&#xff1a; 包括编辑器中的合…

SprinBoot+Vue宠物领养救助微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

JAVA呵护晚年从智慧开始养老护理代办陪诊陪护小程序

呵护晚年&#xff0c;从智慧开始 —— 养老护理代办陪诊陪护小程序全解析 &#x1f475; 【开篇&#xff1a;岁月静好&#xff0c;智慧护航】 随着时光的流转&#xff0c;家中的长辈渐渐步入晚年。如何给予他们最贴心的关怀与照顾&#xff0c;成为了我们心中的头等大事。今天…

Django Admin后台从一个页面同时编辑多个模型

要从Django Admin后台一个页面同时编辑多个对象&#xff0c;我们需要使用内联。 假设你有一个Category模型&#xff0c;并且需要在Admin后台Category编辑页面&#xff0c;同时编辑Villain模型。你可以在admin.py中使用内联&#xff1a; class VillainInline(admin.StackedInl…

光盘安全隔离与信息单向导入系统-信刻

信刻从用户需求出发&#xff0c;为更多用户提供安全可靠的跨网数据单向导入/导出光盘摆渡系统解决方案&#xff0c;解决内外网数据交换的问题&#xff0c;确保数据交换过程的安全性。 公司所研发出的光盘安全隔离与信息单向导入系统依托软硬件相结合的技术&#xff0c;集策略摆…

表外连接,数据去重,存在问题|解决

一、限制去重 1、distinct 整行去重 distinct your_column,.... 问题 &#xff1a;当连接log表&#xff0c;需要统计的主键可能重复 &#xff08;其他列可以相同&#xff0c;只要有一列不同&#xff0c;就会统计&#xff09;。 2、group by 当前字段全部去重 group by …

解决 Linux 上的 SSH 登录缓慢问题

如果您必须等待很长时间才能看到 SSH 密码提示&#xff0c;则可能存在多种问题。要解决 SSH 登录缓慢的根本原因&#xff0c;您可以运行带有 -vvv 选项的 ssh 命令&#xff0c;该命令将向您显示 SSH 登录期间幕后发生的情况。 $ ssh -vvv user<ssh-server>以下是 SSH 登…

猫粮有什么缺陷?主食罐头的好处有哪些?高分猫罐头大推荐

主食罐头是猫咪必需品吗&#xff1f;这应该是养猫新手都有过的疑惑。有的铲屎官可能觉得猫粮猫条小零食就足够了&#xff0c;无需再购置主食罐头。我家之前也是喂干粮的&#xff0c;慢慢地转为全罐喂养&#xff0c;在体验过两种喂养方式后&#xff0c;我只想说给猫猫买主食罐头…

LINUX常用命令-docker-Kubernetes

LINUX常用命令-docker-Kubernetes docker docker run: 创建并启动一个容器。docker ps: 列出当前运行中的容器。docker stop [container_id]: 停止一个运行中的容器。docker start [container_id]: 启动一个已停止的容器。docker rm [container_id]: 删除一个容器。docker im…

Robotics: computational motion planning 部分笔记—— week 1 graph-based

grassfire algorithm 四周扩散性&#xff1b;从终点开始按照相邻最小距离格子移动 Dijkstra’s Algorithm 标明从起点开始的所有点的最短距离&#xff08;从上一节点继承&#xff09;&#xff0c;直到终点 A* Algorithm 带有启发性的&#xff0c;给出距离估计&#xff0c…

DC-DC双向同步升降压35V宽频展频恒压恒流控制器QFN32L

概述&#xff1a; PC1035 是一款同步升降压控制器&#xff0c;适用于驱动高效电源转换器中的 MOSFET 或氮化镓(GaN)等功率器件。它支持高达 35V 的宽输入和输出电压范围&#xff0c;并可在降压、升降压和升压模式之间无缝转换。PC1035 集成了具有 UVLO 保护功能的上管和下管栅…

停止和删除所有 Docker 容器的详细指南

在 Docker 管理中&#xff0c;停止和删除容器是常见的操作&#xff0c;特别是在清理资源或维护环境时。Docker 提供了多种命令来管理容器&#xff0c;包括停止和删除。本文将详细介绍如何停止和删除所有 Docker 容器&#xff0c;包括常见命令的用法及其操作步骤。 一、理解 Doc…

swf怎么转成mp4?swf转mp4,掌握这3招就够了!

在制作动画时&#xff0c;大家经常会用到SWF&#xff08;Shockwave Flash&#xff09;格式。不过有时候&#xff0c;为了让swf格式的软件在播放器上播放&#xff0c;就需要把swf转mp4格式&#xff0c;方便分享和播放了。今天我就来给大家介绍三个简单易行的方法&#xff0c;让你…

在线文档翻译工具哪个好?不妨试试这5款文档翻译软件

当悠长假期的余温尚存&#xff0c;而工作的节奏却已然加速&#xff0c;语言的障碍常让我们在阅读外文文档时感到头重脚轻。 面对着密密麻麻的英文资料&#xff0c;心中不禁涌起一股无力感。但别担心&#xff0c;科技的力量又一次为我们带来了帮助——在线文档翻译工具。 那么…

极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”

数据的流通使用是创新的动力&#xff0c;但安全和合规是不可逾越的底线。企业如何在这三者之间找到平衡点&#xff1f; 极盾科技&#xff0c;助力某金融租赁机构&#xff0c;基于极盾觅踪构建应用数据动态脱敏系统&#xff0c;实现10&#xff0b;核心应用系统的统一管理&#x…

51单片机-串口通信关于SBUF的问题

在8051单片机中&#xff0c;SBUF&#xff08;串行数据缓冲器&#xff09;寄存器用于串口通信的数据发送和接收。以下是如何将数据写入SBUF以及在代码中如何处理SBUF的详细分析&#xff1a; 串口通信的基本流程 发送数据&#xff1a; 当你想要通过串口发送数据时&#xff0c;需…

ArcGIS中利用DEM提取水系线

一、数据来源 本文所用到的数字高程数据采用30米分辨率的ASTER GDEM 30M分辨率数字高程数据&#xff0c;数据来源于中国科学院计算机网络信息中心地理空间数据云平台&#xff08;http://www.gscloud.cn&#xff09;。 该网站数据的下载是按不同比例尺的条带号下载的&#xff0c…