Java [ 基础 ] Stream流 ✨

✨探索Java基础Stream流✨

        在现代Java编程中,Stream是一个非常强大的工具,它提供了一种更高效和简洁的方式来处理集合数据。在这篇博客中,我们将深入探讨Java中的Stream流,介绍它的基础知识、常见操作和一些实用示例。

什么是Stream?

   StreamJava 8引入的一部分,它是一种用于处理数据序列的抽象。Stream允许我们以声明性的方式处理数据,而不是通过编写大量的迭代代码。简而言之,Stream提供了一种简洁而功能强大的数据处理方式。

Stream的特点

  • 不存储数据:Stream本身不存储数据,它们从集合或数组等数据源中获取数据。
  • 不可变性:对Stream的操作不会修改源数据,而是会生成一个新的Stream。
  • 惰性执行:很多Stream操作是惰性执行的,只有在需要结果时才会实际进行计算。

如何创建Stream

有多种方法可以创建Stream,最常见的是从集合或数组中创建。

从集合创建

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

从数组创建

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

使用Stream静态方法

// 使用Stream.of方法创建Stream
Stream<String> myStream = Stream.of("apple", "banana", "orange", "watermelon");

常见的Stream操作

Stream操作可以分为两类:中间操作最终操作

例如:

中间操作

中间操作返回一个新的Stream,它们是惰性执行的。这意味着这些操作不会立即执行,而是会在终端操作调用时执行。

  • filter:过滤数据
  • map:将数据转换为另一种形式
  • flatMap:将多个Stream合并为一个Stream
  • distinct:去重
  • sorted:排序

List<String> myList = Arrays.asList("apple", "banana", "orange", "watermelon", "apple");
// 使用中间操作过滤、映射、去重和排序
Stream<String> myStream = myList.stream().filter(s -> s.startsWith("a")) // 过滤以"a"开头的元素.map(String::toUpperCase)       // 将元素转换为大写.distinct()                     // 去重.sorted();                      // 排序

终端操作

终端操作会触发Stream的实际计算,并返回一个结果或副作用。

  • forEach:对每个元素执行操作
  • collect:将Stream转换为集合
  • count:计算元素数量
  • reduce:聚合元素
  • findFirst:返回第一个元素

// 创建一个包含字符串的列表
List<String> myList = Arrays.asList("apple", "banana", "orange", "watermelon", "apple");// 计算以"a"开头的不同元素数量
long count = myList.stream() // 将列表转换为流.filter(s -> s.startsWith("a")) // 过滤以"a"开头的元素.distinct() // 去重.count(); // 计算数量// 将处理结果收集到列表中
List<String> resultList = myList.stream() // 将列表转换为流.filter(s -> s.startsWith("a")) // 过滤以"a"开头的元素.map(String::toUpperCase) // 将元素转换为大写.distinct() // 去重.sorted() // 排序.collect(Collectors.toList()); // 收集到列表中

示例:处理员工数据

以下是一个处理员工数据的示例,展示了如何使用Stream流来进行复杂的数据处理。

class Employee {private String name;private int age;private double salary;// 构造函数, getter 和 setterpublic Employee(String name, int age, double salary) {this.name = name;this.age = age;this.salary = salary;}public String getName() {return name;}public int getAge() {return age;}public double getSalary() {return salary;}
}List<Employee> employeeList = Arrays.asList(new Employee("张三", 30, 5000),new Employee("李四", 25, 6000),new Employee("王五", 35, 7000),new Employee("赵六", 28, 8000)
);// 使用流计算年龄大于25岁的员工的平均薪水
double averageSalary = employeeList.stream() // 将员工列表转换为流.filter(e -> e.getAge() > 25) // 过滤出年龄大于25岁的员工.mapToDouble(Employee::getSalary) // 将员工对象映射为薪水的双精度值.average() // 计算平均值.orElse(0.0); // 如果没有符合条件的员工,则返回0.0System.out.println("平均薪水: " + averageSalary); // 输出计算出的平均薪水

  1. Employee 类

    • nameagesalary 是私有属性。
    • 构造函数 Employee(String name, int age, double salary) 初始化员工对象。
    • getName()getAge()getSalary() 是用于访问私有属性的 getter 方法。
  2. 员工列表

    • 使用 Arrays.asList 创建一个包含多个 Employee 对象的列表。
  3. 计算平均薪水

    • 使用 stream() 方法将员工列表转换为流。
    • filter(e -> e.getAge() > 25) 过滤出年龄大于25岁的员工。
    • mapToDouble(Employee::getSalary) 将每个员工对象映射为薪水的双精度值。
    • average() 计算过滤后员工的平均薪水。
    • orElse(0.0) 如果没有符合条件的员工,则返回0.0。
  4. 输出结果

    • 使用 System.out.println 输出计算出的平均薪水。

在这个示例中,我们首先过滤出年龄大于25岁的员工,然后提取他们的薪水并计算平均值。

总结

通过深入探索Java中的Stream流,我们了解了它是一种强大且灵活的数据处理工具。Stream流提供了声明性的方式来操作集合数据,具有不可变性和惰性执行的特点。通过丰富的中间操作和终端操作,我们可以轻松实现复杂的数据处理任务,使代码更加简洁、可读和高效。Stream流的引入显著提升了Java编程的生产力和代码质量。

Java的Stream API提供了一种简洁而强大的数据处理方式。通过了解Stream的基础知识和常见操作,我们可以更高效地处理集合数据。

希望这篇博客能够帮助你更好地理解和使用Java的Stream流。

觉得有用的话可以点点赞 (*/ω\*),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

10-错误-java.lang.IllegalStateException Stopwatch is not running

10-错误-java.lang.IllegalStateException Stopwatch is not running 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&…

用易查分下发《致家长一封信》,支持在线手写签名,一键导出PDF!

暑假来临之际&#xff0c;学校通常需要下发致家长信&#xff0c;以正式、书面的形式向家长传达重要的通知或建议。传统的发放方式如家长签字后学生将回执单上交&#xff0c;容易存在丢失、遗忘的问题。 那么如何更高效、便捷、安全地将致家长一封信送达给每位家长呢&#xff1f…

Linux[高级管理]——Squid代理服务器的部署和应用(反向代理详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid的几种模式…

游戏录制视频软件哪个好?这份攻略帮你搞定!

随着游戏行业的快速发展&#xff0c;越来越多的玩家开始录制游戏视频&#xff0c;以便分享自己的游戏体验或保存珍贵回忆。而选择一款合适的游戏录制视频软件显得尤为重要。可是游戏录制视频软件哪个好呢&#xff1f;本文将为大家介绍两款优秀的游戏录制视频软件&#xff0c;通…

Vatee万腾平台:科技驱动,智慧生活

随着科技的飞速发展&#xff0c;我们生活的方方面面正在经历前所未有的变革。Vatee万腾平台&#xff0c;作为这一变革的推动者之一&#xff0c;以其科技驱动的理念&#xff0c;正引领我们迈向更加智慧、便捷的生活。 Vatee万腾平台&#xff0c;是一个集科技研发、应用创新、服务…

Unity热更方案HybridCLR+YooAsset,纯c#开发热更,保姆级教程,从零开始

文章目录&#xff1a; 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案&#xff0c;各种lua热更&#xff0c;ILRuntime等&#xff0c;这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

jvm性能监控常用工具

在java的/bin目录下有许多java自带的工具。 我们常用的有 基础工具 jar:创建和管理jar文件 java&#xff1a;java运行工具&#xff0c;用于运行class文件或jar文件 javac&#xff1a;java的编译器 javadoc&#xff1a;java的API文档生成工具 性能监控和故障处理 jps jstat…

鸿蒙应用更新跳转到应用市场

鸿蒙没有应用下载安装&#xff0c;只支持跳转到应用市场更新 gotoMarket(){try {const request: Want {parameters: {// 此处填入要加载的应用包名&#xff0c;例如&#xff1a; bundleName: "com.huawei.hmsapp.appgallery"bundleName: com.huawei.hmos.maps.app}}…

浅谈定时器之常数吞吐量定时器

浅谈定时器之常数吞吐量定时器 常数吞吐量定时器的主要目的是在JMeter测试中维持一个恒定的吞吐量&#xff08;通常是每分钟的请求数或事务数&#xff09;&#xff0c;从而确保测试能够以预期的负载水平运行。这对于模拟特定的用户访问模式、进行稳定性测试、负载测试以及压力…

量化交易 - 策略回测

策略回测 1、什么是策略回测&#xff1f;2、策略回测的作用3、策略回测系统概述3.1策略回测中相关的指标介绍3.2量化交易策略的资金容量3.3 完整的策略回测系统包含哪些内容 1、什么是策略回测&#xff1f; 策略回测&#xff0c;也称之为策略回溯测试&#xff0c;是指利用交易…

北京酒店订房小程序开发的优势与主要功能

随着我国经济与交通的飞速发展&#xff0c;人们出行的次数越来越多&#xff0c;频率也越来越快。无论是出差还是出游&#xff0c;人家对外出酒店的舒适度与便捷度的要求也越来越高。为了满足人们对于酒店的新需求&#xff0c;北京酒店订房小程序与互联网技术相结合&#xff0c;…

pbootcms后台获取前端表单留言页面url

pbootcms在线留言表单&#xff0c;用户在网页前端提交表单成功后&#xff0c;在网站后台如何获取表单留言页面的url这个参数呢&#xff1f;下面举例说明&#xff1a;首先&#xff0c;我们在PBootcms后台对应的表单&#xff0c;添加需要记录的表单字段&#xff0c;例如 添加liuy…

免费开源AI生产力工具:内置专属ChatGPT、一键智能处理图片和视频(擦除水印、卡通漫画、无损放大、插值补帧、智能修复、3D转制、上色修复、合成整理)

AI 生产力工具 免费开源&#xff0c;提升用户生产力&#xff0c;保障隐私和数据安全。提供高效便捷的AI解决方案&#xff0c;包括但不限于&#xff1a;内置专属ChatGPT、一键批量智能处理图片和视频等。 主要特点 免费开源&#xff1a;免费使用&#xff0c;源代码开放&#…

性价比高真无线蓝牙耳机有哪些?性价比真无线蓝牙耳机推荐

目前真无线蓝牙耳机的音质和性能已经越来越接近甚至超越传统有线耳机。然而&#xff0c;市面上的TWS耳机品牌和型号繁多&#xff0c;价格也从几十元到几千元不等&#xff0c;性价比自然成了消费者选择时的重要考量因素&#xff0c;究竟哪些真无线蓝牙耳机既能够提供满意的音质和…

前沿重器[52] | 聊聊搜索系统5:召回:检索、粗排、多路召回

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

Windows定时任务执行脚本

场景&#xff1a;由于网络波动原因导致云数据库没连接上&#xff0c;从而导致某个流程引擎链接不上数据库从而导致该流程引擎服务挂了&#xff0c;网络恢复后 数据库链接正常&#xff0c;但是该引擎服务还是中止状态。 解决方案&#xff1a;在Windows中新建一个定时任务&#…

为用户转出并处理MODIS NDVI数据案例过程记述,希望对大家有用!

最近为用户转出和处理了一次MODIS NDVI数据&#xff0c;我将过程做了个总结供大家参考&#xff01;希望能帮助到一些下载和处理数据的朋友! 使用工具为三个&#xff1a;地图资源工具 和 GIS数据转换器-栅格&#xff0c;qgis。 1.选择【数据下载功能】&#xff0c;然后选择MO…

复制 pdf 的表格到 markdown 版本的Typora 或者 word 中

在 pdf 中选中复制表格内容&#xff0c;直接粘贴到 typora 中失败&#xff0c;可以使用 txt文件和 excel 做过渡。 准备一个空的 txt 文件&#xff0c;将 pdf 中表格的数据复制粘贴到txt文件中&#xff0c;文本内容会以空格分开&#xff0c;如下图的形式&#xff1a; 打开 exc…

firewalld防火墙转发流量到其他端口forward port rules

假设云主机eth0: 47.93.27.106 tun0: inet 10.8.0.1 netmask 255.255.255.0 Show rules for a specific zone (public) sudo firewall-cmd --zonepublic --list-all Add the tun0 interface to the public zone: sudo firewall-cmd --zonepublic --add-interfacetun0 --…

手把手教你考下39张免费亚马逊AWS证书和学习徽章

小李哥目前共考了39项亚马逊云(AWS)徽章&#xff0c;这也是普通用户可考的全部徽章。这篇文章会介绍如何报名、复习、通过这39张徽章提升云计算基本技能&#xff0c;了解全球第一大云厂亚马逊云科技前沿技术。这篇文章在领英爆&#x1f525;&#xff0c;有将近100k浏览量和11k的…