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

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.hqwc.cn/news/286248.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货教学!!!RHEL8中ansible中常用模块的使用

内容很长各位大老爷耐心观看 本章主要介绍ansible中最常见模块的使用 文件管理模块软件包管理模块服务管理模块磁盘管理模块用户管理模块防火墙管理模块 ansible的基本用法如下 ansible 机器名 -m 模块x -a “模块的参数” 对被管理机器执行不同的操作&#xff0c;只需要调…

【Image】图像处理

计算机视觉 CV Perception 如自动驾驶领域。 只要是从所谓的图像当中去抽取信息的过程&#xff0c;我们都叫做Perception。 视觉检测可以涵盖二维检测&#xff0c;如车辆、人和信号灯的检测。另外&#xff0c;还可以控制三维信息&#xff0c;直接在三维空间中操作数据。 SL…

内网BUG管理系统本地部署并结合内网穿透实现异地远程访问

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

Gartner发布2024 年技术提供商热门趋势:人工智能安全

GenAI 的采用有望带来商业收益&#xff0c;但也敲响了对其可能造成的危害的警报。产品领导者需要在透明度和安全性方面进行投资&#xff0c;以应对不断关注人工智能安全的监管和市场力量。 机会 随着人工智能产品在企业解决方案中的激增&#xff0c;负责任和安全的人工智能将越…

JVM虚拟机系统性学习-JVM调优实战之内存溢出、高并发场景调优

调优实战-内存溢出的定位与分析 首先&#xff0c;对于以下代码如果造成内存溢出该如何进行定位呢&#xff1f;通过 jmap 与 MAT 工具进行定位分析 代码如下&#xff1a; public class TestJvmOutOfMemory {public static void main(String[] args) {List<Object> list…

【Proteus仿真】【Arduino单片机】定时智能插座开关

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使LCD1602液晶&#xff0c;DS18B20温度传感器、按键、蜂鸣器、继电器开关、HC05蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD16…

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

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

unittest自动化测试断言方法的介绍

断言如同在测试用例上&#xff0c;类似于预期结果与实际结果是否一致&#xff0c;如果一致则表示测试通过&#xff0c;Assert断言很好的用于测试结果判断上,更灵活的对预期结果和实际结果进行对比&#xff0c;下面简单的介绍一下unittest的Assert断言 unittest中基础的assert断…

使用Windows批处理命令行和ImageMagick批量将文件夹中的图片转换为PDF文档的方法

目录 应用场景 实现思路 实现过程 1.下载安装imageMagick 2.遍历源文件夹 3.转换图片为pdf文档 4.最终执行的命令 5.结果验证 6.将以上命令改写为windows批处理文件 应用场景 图像是一种常见的数据。图片几乎是一个信息系统中必不可少的组成部分。为了方便阅读&…

机器学习ST股票预测模型(企业建模_论文建模定制服务_信用评分卡等多算法实现)

知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&#xff1b;不知彼&#xff0c;不知己&#xff0c;每战必贻。--《孙子兵法》谋攻篇 ST股票 ST股票是指因连续两年净利润为负而被暂停上市的股票&#xff0c;其风险较高&#xff0c;投资者需要谨慎…

Web自动化框架中验证码识别处理全攻略,让测试更得心应手!

前言&#xff1a; 随着Web应用程序的不断发展&#xff0c;自动化测试已成为项目开发中必不可少的一环。然而&#xff0c;验证码的出现却经常会使自动化测试变得更具挑战性。为了解决这个问题&#xff0c;我们需要一种方法来自动识别和处理验证码&#xff0c;从而提高自动化测试…

超越巨头:Zephyr-7B领跑7B级模型竞赛,开源且笔记本可运行

引言 在AI界的大语言模型&#xff08;LLM&#xff09;竞赛中&#xff0c;Zephyr-7B作为Hugging Face H4团队的最新力作&#xff0c;展现了令人瞩目的技术突破。它不仅性能超越了700亿参数的LLaMA2模型&#xff0c;更引人注目的是&#xff0c;这一开源模型可在常规笔记本电脑上…