Java 8 中的 Stream:优雅的集合处理

news2024/11/25 22:52:30

Java 8 中的 Stream:优雅的集合处理

    • 为什么需要 Stream?
    • Stream 的特性
    • Stream 基本操作
      • 1. 创建 Stream
      • 2. 中间操作
        • 2.1 过滤(Filter)
        • 2.2 映射(Map)
        • 2.3 截断(Limit)
      • 3. 终端操作
        • 3.1 遍历(forEach)
        • 3.2 收集(Collect)
        • 3.3 匹配(Match)
    • 并行 Stream
    • 总结

在Java 8中,引入了一种新的抽象概念——Stream(流),它为集合操作提供了一种极为便利和高效的方式。Stream不是一种数据结构,而是对数据集合进行操作的一种工具,让你能够以一种声明性的方式处理数据。

为什么需要 Stream?

在Java 8之前,我们对集合的操作通常是通过循环来实现的,这样的代码常常显得繁琐、冗长,而且容易引入错误。而引入 Stream 后,可以使用更为直观、简洁的方式进行集合操作,代码更易读、易维护。

Stream 的特性

  1. 声明性编程: 使用 Stream 进行集合操作时,只需关注“做什么”而不是“怎么做”。这种声明性的风格让代码更为清晰。

  2. 可并行: Stream 提供了并行处理的能力,能够充分利用多核处理器的优势,提高处理大数据集合的效率。

  3. 内部迭代: 与外部迭代相比,Stream 使用内部迭代,可以自动选择最优的方法来实现操作,无需手动干预。

Stream 基本操作

1. 创建 Stream

// 从集合创建 Stream
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> streamFromList = list.stream();

// 从数组创建 Stream
String[] array = {"apple", "banana", "orange"};
Stream<String> streamFromArray = Arrays.stream(array);

// 创建一个空的 Stream
Stream<String> emptyStream = Stream.empty();

// 通过 Stream.of() 创建 Stream
Stream<String> streamOf = Stream.of("apple", "banana", "orange");

2. 中间操作

中间操作返回一个新的 Stream,并可以进行链式调用。

2.1 过滤(Filter)
List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "kiwi");

List<String> result = fruits.stream()
                           .filter(s -> s.length() > 5)
                           .collect(Collectors.toList());

System.out.println(result); // Output: [banana, orange]
2.2 映射(Map)
List<String> fruits = Arrays.asList("apple", "banana", "orange");

List<Integer> result = fruits.stream()
                           .map(String::length)
                           .collect(Collectors.toList());

System.out.println(result); // Output: [5, 6, 6]
2.3 截断(Limit)
List<String> fruits = Arrays.asList("apple", "banana", "orange");

List<String> result = fruits.stream()
                           .limit(2)
                           .collect(Collectors.toList());

System.out.println(result); // Output: [apple, banana]

3. 终端操作

终端操作触发 Stream 的处理,并返回结果。每个 Stream 只能进行一次终端操作。

3.1 遍历(forEach)
List<String> fruits = Arrays.asList("apple", "banana", "orange");

fruits.stream()
      .forEach(System.out::println);
3.2 收集(Collect)
List<String> fruits = Arrays.asList("apple", "banana", "orange");

List<String> result = fruits.stream()
                           .filter(s -> s.length() > 5)
                           .collect(Collectors.toList());

System.out.println(result); // Output: [banana, orange]
3.3 匹配(Match)
List<String> fruits = Arrays.asList("apple", "banana", "orange");

boolean anyMatch = fruits.stream()
                        .anyMatch(s -> s.startsWith("b"));

boolean allMatch = fruits.stream()
                        .allMatch(s -> s.length() > 3);

boolean noneMatch = fruits.stream()
                         .noneMatch(s -> s.endsWith("k"));

System.out.println(anyMatch);    // Output: true
System.out.println(allMatch);    // Output: false
System.out.println(noneMatch);   // Output: true

并行 Stream

Stream 提供了并行处理的方法,通过 parallel() 将串行 Stream 转换为并行 Stream。

List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "kiwi");

List<String> result = fruits.parallelStream()
                           .filter(s -> s.length() > 5)
                           .collect(Collectors.toList());

System.out.println(result); // Output: [banana, orange]

总结

Java 8 中的 Stream 带来了一种全新的集合处理方式,使得代码更为简洁、清晰,同时提供了并行处理的能力,能够更高效地处理大数据集合。通过学习和使用 Stream,我们能够写出更具表达力的、易读的代码,提高开发效率。

这里只是简单介绍了 Stream 的基本操作,实际上它还有更多强大的功能,如分组、分区、排序等,可以根据实际需求进一步深入学习。希望这篇博客对你理解和使用 Java 8 中的 Stream 有所帮助。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1321122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32内部是怎么工作的

STM32是怎么工作的 1 从孩子他妈说起2 早期计算机的组成2.1 五大元件&#xff08;1&#xff09;第一个出场的是电容元件&#xff08;2&#xff09;第二个出场的是二极管&#xff08;3&#xff09;第三个出场的是电阻元件&#xff08;4&#xff09;第四个出场的是电感&#xff0…

其他配置相关安装

consul安装和配置 docker run -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600/udp consul consul agent -dev -client0.0.0.0访问&#xff1a;http://192.168.0.102:8500/ DNS查询 dig 192.168.0.102 -p 8600 consul.service.consul SRVnacos安装 ht…

华为OS与麒麟OS:华为自研操作系统的对决

导言 在移动操作系统领域&#xff0c;华为OS和麒麟OS代表了华为在自主研发方面的努力。本文将深入探讨这两个操作系统的特点、竞争关系以及它们在用户体验、生态系统建设等方面的差异。 1. 背景与起源 华为OS的诞生&#xff1a; 华为OS是华为公司为应对外部环境而自主…

12.18_黑马数据结构与算法笔记Java

目录 thinking:orElse? thinking:map.computerifabsent? thinking&#xff1a;subString&#xff1f; 184 哈希表 问2 解释拆分 185 哈希算法 概述 186 哈希算法 Object.hashCode 187 哈希算法 String.hashCode 188 哈希算法 冲突测试 189 哈希算法 MurmurHash 190…

Linux操作系统:自由、稳定、强大的开源之光

导言 Linux操作系统作为一个开源的、多用户、多任务、支持多线程和多CPU的UNIX类操作系统&#xff0c;不仅在服务器领域占有显著份额&#xff0c;也逐渐在桌面和嵌入式系统中崭露头角。Linux操作系统的多样性体现在各种不同的发行版上&#xff0c;而Ubuntu、CentOS和Red Hat可以…

用Python编辑PDF文件:拆分合并、加密解密、页面编辑

文章目录 安装和初步使用合并与拆分页面编辑加密解密 安装和初步使用 PyPDF2支持拆分、合并、页面旋转、添加水印、加密解密等操作。支持pip安装&#xff0c;过程很丝滑。 pip install PyPDF2PyPDF2提供了PdfFileReader类&#xff0c;可用于读取PDF文件&#xff0c;其metadat…

用户行为分析遇到的问题-ubantu16,hadoop3.1.3

用户行为分析传送门 我的版本 ubantu16 hadoop 3.1.3 habse 2.2.2 hive3.1.3 zookeeper3.8.3 sqoop 1.46/1.47 我sqoop把MySQL数据往hbase导数据时候有问题 重磅&#xff1a;大数据课程实验案例&#xff1a;网站用户行为分析&#xff08;免费共享&#xff09; 用户行为分析-小…

使用ffmpeg将图片合成为mp4

首先在在图片文件夹输入cmd 这里确保已经安装ffmpeg并配置好环境变量。 然后这是我的文件夹目录&#xff1a; 将21张图片合成为mp4视频 这里使用如下命令&#xff1a; ffmpeg -framerate 1 -start_number 0 -i %d.png -c:v libx264 -pix_fmt yuv420p output.mp4 -framerat…

rabbitmq-常见七种消息队列-控制台界面管理-python-实现简单访问

文章目录 1.消息的基本概念1.1.生产者和消费者1.2.消息队列(Queue)1.3.交换机(Exchange)1.4.消息确认 2.七种队列模式2.1.简单模式(Hello World)2.2.工作队列模式(Work queues)2.3.发布订阅模式(Publish/Subscribe)2.4.路由模式(Routing)2.5.主题模式(Topics)2.6.远程过程调用(…

windows下wsl(ubuntu)ldconfig报错

错误 sudo ldconfig /sbin/ldconfig.real: Cant link /usr/lib/wsl/lib/libnvoptix_loader.so.1 to libnvoptix.so.1 /sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link解决&#xff1a; 处理 sudo ldconfig 报错 libcuda.so.1 is not a symbolic …

GZ015 机器人系统集成应用技术样题8-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题8 选手须知&#xff1a; 本任务书共 25页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

RPC(3):HttpClient实现RPC之GET请求

1HttpClient简介 在JDK中java.net包下提供了用户HTTP访问的基本功能&#xff0c;但是它缺少灵活性或许多应用所需要的功能。 HttpClient起初是Apache Jakarta Common 的子项目。用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 H…

3.2 内容管理模块 - 课程分类、新增课程、修改课程

内容管理模块-课程分类、新增课程、修改课程 文章目录 内容管理模块-课程分类、新增课程、修改课程一、课程分类1.1 课程分类表1.2 查询树形结构1.2.1 表自连接1.2.2 SQL递归 1.3 Mapper1.4 Service1.5 Controller1.6 效果图 二、添加课程2.1 需求分析2.2 数据表2.2.1 课程基础…

【linux】SSH终端Putty配置:文件上传/下载、显示中文字体、自动登录

文章目录 写在前面putty上传/下载文件1. 下载2. 解压和配置3. 使用sz/rz3.1 下载文件:sz3.2 上传文件:rz 显示中文字体1. 下载合适的字体2. 解压和安装3. putty配置 putty自动登录1. putty配置2. putty快捷方式配置3. 使用putty 写在后面 写在前面 一篇博客介绍了12种SSH终端工…

福德植保无人机工厂:创新科技与绿色农业的完美结合

亲爱的读者们&#xff0c;欢迎来到福德植保无人机工厂的世界。这里&#xff0c;科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者&#xff0c;以其领先的无人机技术&#xff0c;创新的理念&#xff0c;为我们展示了一种全新的农业服…

C++共享和保护——(4)保护共享数据

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 一滴汗珠万粒粮&#xff0c;万粒汗珠谷…

Scala多线程爬虫程序的数据可视化与分析实践

一、Scala简介 Scala是一种多种类型的编程语言&#xff0c;结合了针对对象编程和函数式编程的功能。它运行在Java虚拟机上&#xff0c;具有强大的运算能力和丰富的库支持。Scala常用于大数据处理、并发编程和Web应用程序开发。其灵活性和高效性编程成为编写多线程爬虫程序的理…

SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?

文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里&#xff0c;MVCC的实现机制是不同的。本节我们会以InnoDB举例&#xff0c;讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念&#xff1a; 事务版本号行记录的隐藏…

02.微服务组件 Eureka注册中心

1.Eureka注册中心 服务提供者与消费者&#xff1a; 服务提供者:一次业务中&#xff0c;被其它微服务调用的服务。(提供接口给其它微服务)服务消费者:一次业务中&#xff0c;调用其它微服务的服务。&#xff08;调用其它微服务提供的接口)一个服务是消费者还是提供者&#xff…

Apache Flink(十五):Flink任务提交模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录