Java 流Stream

文章目录

  • 前言
  • Stream是什么
  • Stream流语法
  • Stream流的常用方法
  • 代码示例


前言

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。


Stream是什么

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。可以是集合,数组,I/O channel,产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作,比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同,Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。这样多个操作可以串联成一个管道,如同流式风格(fluent style)。这样做可以对操作进行优化,比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,通过访问者模式(Visitor)实现。

Stream流语法

| stream of elements +> |filter±> |sorted±> |map±> |collect|

Stream流的常用方法

  • 终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法
  • 非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,conat
方法名称方法作用方法种类是否支持链式调用
count统计个数终结方法
forEach迭代处理终结方法
filter过滤函数拼接
limit取用前几个函数拼接
skip跳过前几个函数拼接
map映射函数拼接
concat组合函数拼接
distinct去重函数拼接
sorted排序函数拼接
peek流中调用函数拼接
collect集合函数拼接

代码示例

public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("一往情深");list.add("石昊");list.add("秦昊");list.add("石中天");// 过滤出名字结尾有“昊”的名字list.stream().filter(p -> p.endsWith("昊")).forEach(p -> {System.out.println("符合条件的姓名:" + p);});System.out.println("--------------------------------");// 过滤出名字第一个字有“石”的名字,并且名字长度是3个数list.stream().filter(p -> p.startsWith("石")).filter(p -> p.length() == 3).forEach(p -> {System.out.println("符合条件的姓名:" + p);});}
}

输出:

符合条件的姓名:石昊
符合条件的姓名:秦昊
--------------------------------
符合条件的姓名:石中天

public class Test {public static void main(String[] args) {String str = "一往情深  ,石昊,秦昊,石中天, , 一往情深,AA,aa";// 1. 按“,”分割成数组// 2. 去除左右两边空格// 3. 转小写// 4. 过滤出不为空的// 5. 去重Arrays.stream(str.split(",")).map(String::trim).map(String::toLowerCase).filter(StringUtil::isNotEmpty).distinct().collect(Collectors.toList()).forEach(s -> {switch (s) {case "一往情深":System.out.println("作者:" + s);break;case "石昊":System.out.println("这个就厉害了:" + s);break;default:System.out.println(s);break;}});}
}

输出:

作者:一往情深
这个就厉害了:石昊
秦昊
石中天
aa

public class Test {public static void main(String[] args) {// stream()操作对象示例List<User> userList = new ArrayList<>();userList.add(new User(1, "1号选手"));userList.add(new User(2, "2号选手"));userList.add(new User(3, "3号选手"));// 过滤出id大于1的UserSystem.out.println(userList.stream().filter(p -> p.getId() > 1).collect(Collectors.toList()));// 1. 按id倒序,从大到小// 2. 过滤出name中不包含2的User对象System.out.println(userList.stream().sorted(Comparator.comparing(User::getId).reversed()).filter(p -> !p.getName().contains("2")).collect(Collectors.toList()));}
}@Getter
@ToString
class User {private Integer id;private String name;public User(Integer id, String name) {this.id = id;this.name = name;}
}

输出:

[User(id=2, name=2号选手), User(id=3, name=3号选手)]
[User(id=3, name=3号选手), User(id=1, name=1号选手)]

public class test {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);// 统计IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();System.out.println("列表中最大的数 : " + stats.getMax());System.out.println("列表中最小的数 : " + stats.getMin());System.out.println("所有数之和 : " + stats.getSum());System.out.println("平均数 : " + stats.getAverage());}
}

输出:

列表中最大的数 : 7
列表中最小的数 : 2
所有数之和 : 25
平均数 : 3.5714285714285716

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

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

相关文章

【高并发】高并发架构实战:从需求分析到系统设计

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 很多软件工程师的职业规划是成为架构师&#xff0c;但是要成为架构师很多时候要求先有架构设计经验&#xff0c;而不做架构师又怎么会有架构设计经验呢&#xff1f;那么要如何获得架构设…

前端渲染模式CSR,SSR,SSG,ISR,DPR

目录 一、客户端渲染——CSR&#xff08;Client Side Rendering&#xff09; 二、服务器端渲染——SSR&#xff08;Server Side Rendering&#xff09; 三、静态站点生成——SSG&#xff08;Static Site Generation&#xff09; 四、增量静态生成——ISR&#xff08;Increm…

【软件测试】在Windows环境安装Docker(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 下载和安装 1、地…

智慧园区4G+蓝牙+GPS/北斗RTK人员定位系统解决方案

智慧园区是指利用现代科技手段进行精细化管理的园区&#xff0c;人员定位技术被广泛应用在智慧园区。智慧园区人员定位技术通过使用传感器设备&#xff0c;能够实时监测园区内人员的位置和活动情况&#xff0c;从而提高园区的人员管理效率和安全性。 通过人员定位&#xff0c;…

云HIS是什么?HIS系统为什么要上云?云HIS有哪些优点?

一、当前医疗行业HIS的现状与发展趋势 1.医院信息系统&#xff08;HIS&#xff09;经历了从手工到单机再到局域网的两个阶段&#xff0c;随着云计算、大数据新技术迅猛发展&#xff0c;基于云计算的医院信息系统将逐步取代传统局域网HIS , 以适应人们对医疗卫生服务越来越高的要…

常用分类损失CE Loss、Focal Loss及GHMC Loss理解与总结

一、CE Loss 定义 交叉熵损失&#xff08;Cross-Entropy Loss&#xff0c;CE Loss&#xff09;能够衡量同一个随机变量中的两个不同概率分布的差异程度&#xff0c;当两个概率分布越接近时&#xff0c;交叉熵损失越小&#xff0c;表示模型预测结果越准确。 公式 二分类 二…

Zookeeper 分布式锁案例

一、概述&#xff1a; Zookeeper 是一个开源的分布式协调服务&#xff0c;可以用于维护分布式系统中的一致性、顺序性和命名等。其中&#xff0c;Zookeeper 的分布式锁机制可以用于实现分布式系统中的互斥访问&#xff0c;确保在多个节点上对共享资源进行同步访问。 Zookeepe…

深入理解预训练(pre-learning)、微调(fine-tuning)、迁移学习(transfer learning)三者的联系与区别

1. 什么是预训练和微调 你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先&#xff0c;你需要随机初始化参数&#xff0c;然后开始训练网络&#xff0c;不断调整参数&#xff0c;直到网络的损失越来越小。在训练的过程中&#xff0c;一开始初始化的参数会不断变化。…

小程序:页面跳转闪屏

自己的笔记&#xff0c;随手记录。扛精走开。 1、问题描述 进入页面&#xff0c;是一个组件&#xff0c;通过路由传参判断是由哪个页面进入&#xff0c;不同的页面拿的已选值不一样&#xff0c;需要回显值&#xff0c;在编辑数据。此时会出现一个问题&#xff0c;A页面中进来…

Serverless和EDA是绝配,亚马逊云科技CTO Werner表示需要用开放心态来重新审视架构

前一段有个很火的博客&#xff0c;讲的是一家全球流媒体企业的监测系统从Serverless微服务改成了单体&#xff0c;成本居然降低了90%&#xff01;这一下子可在网上炸锅了&#xff0c;特别是一些看不惯微服务的、单体应用的拥趸&#xff0c;更是坐不住了。但这并不像吃瓜群众看到…

0基础学C#笔记01:数组复制

文章目录 前言一、错误的复制方式二、正确的复制方式1.复制方式 一2.复制方式 二3.复制方式 三4.复制方式 四三、验证总结前言 C# 数组复制的四种方式,简单明了实用 我们先创建一个数组: string[] names = {"张三", "李四",

【ECharts系列】ECharts 图表渲染问题解决方案

1 问题描述 echats 渲染&#xff0c;第一次的时候只出现Y轴数值&#xff0c;不出现X轴数值&#xff0c;切换下页面&#xff0c;X轴数值就能出现。 2 原因分析 如果在使用ECharts渲染时&#xff0c;X轴数值只在切换页面后才出现&#xff0c;可能是因为ECharts在初始化时没有正确…

光速吟唱,Clibor ,批量多次复制依次粘贴工具 快捷输入软件教程

批量多次复制依次粘贴工具 批量复制粘贴工具0.81.exe https://www.aliyundrive.com/s/3sbBaGmHkb8 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 青县solidworks钣金设计培训 …

Redis进阶 - Redis哨兵

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis进阶 - Redis哨兵 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-sentinel.html 思考 slave 节点宕机恢复以后可以找 master 节点同步数据&#xff0c;那么 master 节点宕机怎么办&am…

MFC 利用多态的特性实现子窗口同时存在一个

多个子窗口的类都继承同一父类 CDialogEx 于是在主窗口我声明一个CDialogEx指针 通过判断该指针是否为空 不为空则视为有一子窗口存在 注意这里介绍的是 非模态化窗口的关闭 你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。&#xff08;DestroyWindow()的…

[Docker] Docker镜像管理和操作实践(二) 文末送书

前言&#xff1a; Docker镜像是容器化应用程序的打包和分发单元&#xff0c;包含了应用程序及其所有依赖项&#xff0c;实现了应用程序的可移植性和一致性。 文章目录 使用Dockerfile创建自定义镜像实践练手1. 创建基于ubuntu的自定义镜像&#xff0c;并安装nginx2. 配置Redis容…

MySQL数据库高级查询语句

MySQL数据库高级查询语句 一、语句SELECT ----显示表格中一个或数个字段的所有数据记录DISTINCT ----不显示重复的数据记录WHERE ----有条件查询AND OR ----且 或IN ----显示已知的值的数据记录BETWEEN ----显示两个值范围内的数据记录通配符 ----通常通配符都是跟 LIKE 一起使…

【云原生】二进制k8s集群(下)部署高可用master节点

本次部署说明 在上一篇文章中&#xff0c;就已经完成了二进制k8s集群部署的搭建&#xff0c;但是单机master并不适用于企业的实际运用&#xff08;因为单机master中&#xff0c;仅仅只有一台master作为节点服务器的调度指挥&#xff0c;一旦宕机。就意味着整个集群的瘫痪&#…

input.unsqueeze(0)的作用

input.unsqueeze(0) 是 PyTorch 张量&#xff08;Tensor&#xff09;的方法之一&#xff0c;用于增加张量的维度。具体来说&#xff0c;它会在索引为 0 的位置上插入一个维度。 假设 input 是一个形状为 (n,) 的一维张量&#xff0c;其中 n 是任意长度。调用 unsqueeze(0) 后&…

【Web3】 Web3JS Pay Api

Web3Network.eth.sendSignedTransaction(serializedTx) 参数&#xff1a; from- String|Number&#xff1a;发送帐户的地址。如果未指定&#xff0c;则使用web3.eth.defaultAccount属性。或web3.eth.accounts.wallet中本地的地址。 to- String:(可选&#xff09;消息的目标地址…