Java [ 基础 ] Stream流 ✨

news2024/12/23 1:18:55

✨探索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 和 setter
    public 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.0

System.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.coloradmin.cn/o/1894448.html

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

相关文章

暗潮短视频:成都柏煜文化传媒有限公司

暗潮短视频&#xff1a;涌动的新媒体力量 在数字化时代的浪潮中&#xff0c;短视频以其独特的魅力和无限的潜力&#xff0c;迅速成为新媒体领域的一股强大力量。而在这片繁荣的短视频领域中&#xff0c;成都柏煜文化传媒有限公司“暗潮短视频”以其独特的定位和深邃的内容&…

解决mysql数据库连接报错:Authentication plugin ‘caching_sha2_password‘ cannot be loaded

解决mysql数据库连接报错&#xff1a;Authentication plugin ‘caching_sha2_password’ cannot be loaded OperationalError: (2059, “Authentication plugin ‘caching_sha2_password’ cannot be loaded: /usr/lib/mysql/plugin/caching_sha2_password.so: cannot open sha…

虚拟机与主机的联通

本地光纤分配地址给路由器--》连结路由器是连结局域网--》由路由器分配IP地址 因此在网站上搜索的IP与本机的IP是不一样的 1.windows查看主机IP地址 在终端输入 2.linux虚拟机查看ip 3.主机是否联通虚拟机ping加ip

【AI学习】无线AI的问题和挑战

无线AI&#xff0c;即无线人工智能&#xff0c;是指内生于未来&#xff08;6G&#xff09;无线通信系统并通过无线架构、无线数据、无线算法和无线应用所呈现出来的新的人工智能技术体系。 最近一直在进行无线AI的调研&#xff0c;感觉真的是路漫漫其修远兮。业界有一些探索&a…

数学建模------Matlab数据可视化

目录 1.plot函数 &#xff08;1&#xff09;函数介绍 &#xff08;2&#xff09;参数介绍 &#xff08;3&#xff09;图形美化 &#xff08;4&#xff09;背景更改 &#xff08;5&#xff09;多组绘制 &#xff08;6&#xff09;图形叠加 &#xff08;7&#xff09;添加…

Matplotlib 简介

import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4]) plt.ylabel(some numbers) plt.show() 当使用plot只传入单个数组时&#xff0c;matplotlib会认为这是y的值&#xff0c;并自动生成长度相同&#xff0c;但是从0开始的x值&#xff0c;所以这里的x会自动生成为 [0,1,2,…

Vue.js 案例——商品管理

一.需要做出的效果图&#xff1a; 二.实现的步骤 首先&#xff0c;先建一个项目&#xff0c;命名Table&#xff0c;在Table项目中的components里新建一个MyTable.vue文件。 第二步&#xff0c;在原有的 HelloWorld.vue中写入代码。 HelloWorld.vue代码如下&#xff1a; <…

土地规划与文化遗产保护:在发展浪潮中守护历史的脉络

在这个日新月异的时代&#xff0c;城市化进程如火如荼&#xff0c;土地规划作为引导城市发展方向的关键&#xff0c;承载着平衡发展与保护的重任。在追求现代化的同时&#xff0c;保护文化遗产不仅是对过去的尊重&#xff0c;更是对未来负责。本文旨在深入探讨如何在土地规划实…

云桌面运维工程师

一 深信服驻场工程师 1 深信服AC、AF、AD、NGAF、WOC Atrust、WAF项目实施经验者优先考虑。 负责云桌面POC测试 部署和配置&#xff1a;设置云桌面基础设施&#xff0c;包括虚拟化平台、云桌面管理软件和相关组件。确保正确配置网络、存储和安全设置。 用户体验&#xff1…

7.3数据库第一次作业

安装MySQL 1.打开安装包 2.选择自定义安装&#xff08;custom&#xff09;并点击下一步 3.自定义安装路径 4.点击执行 5.执行成功 6.默认选项点击下一步 7.选择新的授权方式并点击下一步 8.配置密码 9.默认配置并点击下一步 10.点击执行&#xff08;Execute&#xff09; 11.执…

bcc python开发示例

文章目录 1. hello_world.py2. hello_fields.py3. sync_timing.py4. disksnoop.py5. hello_perf_output.py6. bitehist.py7. vfsreadlat.py8. urandomread.py9. strlen_count.py10. nodejs_http_server.py11. task_switch.c12. 监视 do_execve 1. hello_world.py from bcc imp…

Ubuntu 24.04-自动安装-Nvidia驱动

教程 但在安全启动模式下可能会报错。 先在Nvidia官网找到GPU对应的驱动版&#xff0c; 1. 在软件与更新中选择合适的驱动 2. ubuntu自动安装驱动 sudo ubuntu-drivers autoinstall显示驱动 ubuntu-drivers devices3. 安装你想要的驱动 sudo apt install nvidia-driver-ve…

React@16.x(48)路由v5.x(13)源码(5)- 实现 Switch

目录 1&#xff0c;原生 Switch 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Switch 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; function News() {return <div className"p…

Qt界面中的子窗口实现鼠标拖动边缘改变大小以及移动(完整demo代码)

目录 效果 拖拽 移动​编辑 实现 DragResizeWgt类.h文件 DragResizeWgt类.cpp文件 使用 testwidget窗口.ui文件 testwidget窗口.h文件 testwidget窗口.cpp文件 参考 效果 想要的效果就是类似于QT IDE中的效果&#xff0c;可以拖动边缘改变大小&#xff0c;用户自身可…

传承与创新,想让认字更简单?就来看《米小圈动画汉字》吧!

汉字&#xff0c;作为中华文化的精髓和根基&#xff0c;自古以来便承载着中华民族的思想与记忆。在现代社会&#xff0c;随着文化多样性的崛起和科技进步的推动&#xff0c;汉字的教育也更加的多元化&#xff0c;《米小圈动画汉字》作为一项全新的教育资源&#xff0c;不仅致力…

WAIC热点聚焦|具身智能简介:AI新浪潮的领跑者

WAIC热点聚焦|具身智能简介&#xff1a;AI新浪潮的领跑者 引言 随着"具身智能"&#xff08;Embodied Intelligence&#xff09;的火热讨论&#xff0c;2024年标志着人机交互新时代的开启。在大模型技术的推动下&#xff0c;机器人响应语音指令成为现实&#xff0c;…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示DS3231 RTC时间

LCD ST7735显示DS3231 RTC时间 文章目录 LCD ST7735显示DS3231 RTC时间1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板 (ESP-12E) 和 DS3231 RTC 模块制作一个简单的数字实时时钟,其中可以使用连接到 NodeMCU 的两个按钮设置时间和日期,并将它们打印(带…

CS算法(二)—— 斜视SAR点目标仿真

SAR成像专栏目录 我们按照Cumming教授所著的《合成孔径雷达成像——算法与实现》7.6节的点目标参数进行仿真,斜视角设置为8,中心斜距改为1000km。先放最终的仿真结果: 1. 参数配置 在中心点和中心的的上下左右方向设置5个点目标 : function para=config_sar_para_cumming(…

unity强力配置插件Luban【Next最新版本】(二)本地化

文章目录 前言一、快速实现静态本地化1、表格格式2、本地化文本3、修改bat文件3、打表 二、多语言切换1、修改bat文件2、增加本地化管理脚本3、测试 总结 前言 无需多言&#xff0c;本地化&#xff08;Localization&#xff0c;简称 L10N&#xff09;是指将产品、内容或服务适…

人工智能在日常生活中的十大应用:从医疗到智能家居

人工智能已成为当今人类日常生活的重要组成部分&#xff0c;无论您是否意识到&#xff0c;它几乎在所有场景中都能提供帮助。每次您进行网络搜索、在线预订旅行、接收来自京东等购物平台的产品推荐又或是打开您的新浪、抖音时&#xff0c;都能看到影子&#xff0c;这些只是一些…