当前位置: 首页 > article >正文

专题 - Java Stream API

概述

分类

在这里插入图片描述

数据源

任何位置。

如:集合、数组、文件、随机数、 Stream 静态工厂等。

支持的数据类型

  1. 整型、长整型、双精度浮点型基本数据类型。
  2. 引用数据类型。

流管道的数据处理流程

在这里插入图片描述

  1. 流管道必须要有终止操作。否则永不执行,只是一个静默的无操作指令。
  2. 流管道是懒运算的。当执行终止操作时,计算才真正去执行。

常用的函数式接口

均位于 java.util.function 包中。
在这里插入图片描述

常用的 Stream API

在这里插入图片描述

经验总结

在这里插入图片描述

技术点聚焦

Stream.peek() 与 Stream.map()

在这里插入图片描述

并行流

适用场景:

  1. 硬件方面:CPU核心数多。
  2. 流方面:
    1. 数据量大。
    2. 易于被Fork-Join框架分解。
    3. 其内的元素,尽量为基本数据类型。
    4. 其内的元素间,尽量避免有状态、有关联、有依赖。
  3. 操作方面:
    1. 处理每个元素的耗时长。

    2. 进行无状态操作。

      如map()、filter()、flatMap()。

    3. 进行线程安全操作。

示例

函数式接口

Predicate

示例1:将判断逻辑,封装进Predicate对象内,并将其应用至集合的每个元素,来筛选出所需元素
// 初始化测试数据
Integer[] arrays = new Integer[]{22, 108, 11, 33, 3, 7};// 表示一个可应用于整型包装类型的断言/判断:当目标数值 >= 20时,将返回true,否则返回false。
Predicate<Integer> p1 = e -> e >= 20; 
// 表示一个可应用于整型包装类型的断言/判断:当目标数值 <= 50时,将返回true,否则返回false。
Predicate<Integer> p2 = e -> e <= 50;Stream.of(arrays) // 将元素载入Stream流中.filter(p1.and(p2)) // filter()方法的定义:Stream<T> filter(Predicate<? super T> predicate);,表示返回一个由满足Predicate元素构成的流。// 即filter()方法的入参要传入Predicate类型的。// filter()方法的入参:p1.and(p2),表示将流中的每个元素套入此表达式中,注意判断是否同时满足两个Predicate。// 如果某个元素同时满足两个Predicate,则将这个元素加入到新返回的Stream流中。.forEach(e -> LOGGER.info(e));
22
33
示例2:将判断逻辑,封装进Predicate对象内,并将其应用至集合的每个元素,来筛选出所需元素
// 人类信息Bean
private static final class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}
}/* ********************** 以下是main()方法 ********************** */// 初始化测试数据
Person[] persons = new Person[]{new Person("张三", 22),new Person("李四", 77),new Person("王五", 13),new Person("赵六", 36),new Person("孙七", 81)};// 使用断言筛选高龄老人。当年龄 >= 80岁,则视为老人
// 表示一个可应用于Person类型的断言/判断:当Person对象中的属性age的值 >= 80时,将返回true,否则返回false。 
Predicate<Person> agedPredicate = item -> item.age >= 80;List<Person> agedList = Stream.of(persons) // 将元素载入Stream流中.filter(item -> agedPredicate.test(item)) // 将流中的每个元素,逐一套入到agedPredicate断言中进行判断,返回true的元素才添加到待返回的流中.collect(Collectors.toList());// 输出老人信息
agedList.forEach(item -> LOGGER.info(item.name));
孙七

Consumer

示例1:将指定入参且无返回值的业务逻辑,封装进Consumer对象内,并指定对象来消费
// 初始化测试数据
int[] numbers = new int[]{22, 108, 11, 33, 3, 7};
List<Integer> newNumbers = Lists.newArrayList();// 为集合内的每个元素都+1,并放入一个新集合的消费者
// 这是一个无需返回值的复杂业务逻辑,将这个业务逻辑封装进了Consumer对象中
Consumer<Integer> addOneConsumer = (item) -> newNumbers.add(item + 1);// 迭代原始数组,并调用Consumer接口的accept()方法,逐个执行addOneConsumer对象中的业务逻辑
for (Integer item : numbers) {addOneConsumer.accept(item);
}// 输出新集合
newNumbers.forEach(item -> LOGGER.info(item + ""));
23
109
12
34
4
8
示例2:将指定入参且无返回值的业务逻辑,封装进Consumer对象内,并做为函数参数来传递,实现指定对象的消费
/*** 教师类*/
class Teacher {private final String teacherName; // 教师姓名private final List<Student> students; // 班上学生private final Consumer<Student> calculateScoreConsumer; // 打印输出学生成绩的消费者public Teacher(String teacherName, List<Student> students, Consumer<Student> calculateScoreConsumer) {this.teacherName = teacherName;this.students = students;this.calculateScoreConsumer = calculateScoreConsumer;}/*** 打印输出学生成绩*/public void outputStudentScore() {// 迭代这位教师下的所有学生,然后依次调用Consumer接口的accept()方法去消费学生// Consumer接口的特点是给定入参,直接消费掉,没有出参。而此处正好只是做输出,所以也没必要有返回值,正好符合Consumer接口的使用场景。for (Student s : students) {calculateScoreConsumer.accept(s);}}

相关文章:

专题 - Java Stream API

概述 分类 数据源 任何位置。 如:集合、数组、文件、随机数、 Stream 静态工厂等。 支持的数据类型 整型、长整型、双精度浮点型基本数据类型。引用数据类型。流管道的数据处理流程 流管道必须要有终止操作。否则永不执行,只是一个静默的无操作指令。流管道是懒运算的。当执…...

【前端框架】vue2和vue3的区别详细介绍

Vue 3 作为 Vue 2 的迭代版本&#xff0c;在性能、语法、架构设计等多个维度均有显著的变革与优化。以下详细剖析二者的区别&#xff1a; 响应式系统 Vue 2 实现原理&#xff1a;基于 Object.defineProperty() 方法实现响应式。当一个 Vue 实例创建时&#xff0c;Vue 会遍历…...

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3)

大模型WebUI&#xff1a;Gradio全解11——使用transformers.agents构建Gradio UI&#xff08;3&#xff09; 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.3 创建和使用工具Tools11.3.1 默认工具箱与load_tool11.3.2 创建新工具11.3.3 管理代理的工具箱toolbox11.3…...

路由基础 | 路由引入实验 | 不同路由引入方式存在的问题

注&#xff1a;本文为 “路由基础 | 路由表 | 路由引入” 相关文章合辑。 未整理去重。 路由基本概念 1—— 路由表信息、路由进表以及转发流程、最长掩码匹配原则 静下心来敲木鱼已于 2023-11-26 14:06:22 修改 什么是路由 路由就是指导报文转发的路径信息&#xff0c;可以…...

网络原理-HTTP/HTTPS

文章目录 HTTPHTTP 是什么&#xff1f;理解“应用层协议”理解 HTTP 协议的⼯作过程HTTP 协议格式抓包⼯具的使用抓包⼯具的原理抓包结果协议格式总结 HTTP 请求&#xff08;Request&#xff09;认识 URLURL 的基本格式关于URL encode 认识“⽅法”&#xff08;method&#xff…...

Docker 镜像操作笔记

一、简介 Docker 镜像是容器运行的基础&#xff0c;它包含了容器运行所需的文件系统、应用程序及其依赖。镜像是不可变的&#xff0c;每次修改都会生成一个新的镜像。以下是对 Docker 镜像操作的详细介绍&#xff0c;包括常用的命令及其参数解释。 二、镜像操作 &#xff08;…...

SpringBoot启动失败之application.yml缩进没写好

修改前&#xff1a; spring前面空格了 报错输出&#xff1a;Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the follow…...

python爬虫系列课程2:如何下载Xpath Helper

python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…...

CentOS建立ssh免密连接(含流程剖析)

一、场景举例(为啥需要免密连接) 1.服务集群间文件复制、通信 2.执行定时触发自动化脚本 3.本地连接远程服务器操作 服务器台数有很多&#xff0c;以上举例都是属于服务器之间的通信&#xff0c;如果每次执行上面操作都要输入账号密码岂不是效率太高了&#xff0c;容易被开…...

自由学习记录(36)

Linux Linux 是一个开源的操作系统&#xff0c;其内核及大部分组件都遵循自由软件许可证&#xff08;如 GPL&#xff09;&#xff0c;允许用户查看、修改和分发代码。这种开放性使得开发者和企业可以根据自己的需求定制系统​。 “Linux”严格来说只是指由Linus Torvalds最初开…...

动态订阅kafka mq实现(消费者组动态上下线)

和上篇文章 动态订阅rocket mq实现(消费者组动态上下线) 目的一致&#xff0c;直接上代码 /*** Kafka topic container集合*/private static final Map<String, ConcurrentMessageListenerContainer<String, String>> topics new HashMap<>();public void r…...

【python碎碎笔记】

1.交互模式和编辑器模式 2. 保存文件格式.py &#xff08;表示python文件&#xff09; 3.缩进是python的命&#xff01; 4.内置函数 dir(__builtins__) [ArithmeticError, AssertionError, AttributeError, BaseException, BaseExceptionGroup, BlockingIOError, Broken…...

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(2)

大模型WebUI&#xff1a;Gradio全解11——使用transformers.agents构建Gradio UI&#xff08;2&#xff09; 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.2 定义大模型引擎Engines11.2.1 引擎函数&#xff1a;llm_engine11.2.2 TransformersEngine类11.2.3 HfApiE…...

【OS安装与使用】part3-ubuntu安装Nvidia显卡驱动+CUDA 12.4

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 更改镜像源2.2.2 安装NVIDIA显卡驱动&#xff1a;nvidia-550&#xff08;1&#xff09;查询显卡ID&#xff08;2&#xff09;PCI ID Repository查询显卡型号&#xff08;3&#xf…...

python-leetcode 37.翻转二叉树

题目&#xff1a; 给定一颗二叉树的根节点root,翻转这棵二叉树&#xff0c;并返回根节点 方法一&#xff1a;递归 从根节点开始&#xff0c;递归地对树进行遍历&#xff0c;并从叶子节点先开始翻转。如果当前遍历到的节点root的左右两棵子树都已经翻转&#xff0c;那么我们只…...

Vue 实现通过URL浏览器本地下载 PDF 和 图片

1、代码实现如下&#xff1a; 根据自己场景判断 PDF 和 图片&#xff0c;下载功能可按下面代码逻辑执行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下载if (item.format pdf) {const response await fetch(item.url); // URL传递进入i…...

android,flutter 混合开发,pigeon通信,传参

文章目录 app效果native和flutter通信的基础知识1. 编解码器 一致性和完整性&#xff0c;安全性&#xff0c;性能优化2. android代码3. dart代码 1. 创建flutter_module2.修改 Android 项目的 settings.gradle&#xff0c;添加 Flutter module3. 在 Android app 的 build.gradl…...

unity学习47:寻路和导航,unity2022后版本如何使用 Navmesh 和 bake

目录 1 寻路和导航对移动的不同 1.1 基础的移动功能 1.1.1 基础移动 1.1.2 智能导航寻路 1.1.3 智能导航寻路还可以 2 如何实现这个效果&#xff1f; 2.1 通过地图网格的形式 2.1.1 警告信息 the static value has been deprecated的对应搜索 2.1.2 新的navigation ba…...

跟着李沐老师学习深度学习(十二)

循环神经网络 序列模型 序列数据 实际中很多数据是有时序结构的 比如&#xff1a;电影的评价随时间变化而变化 拿奖后评分上升&#xff0c;直到奖项被忘记看了很多好电影后&#xff0c;人们的期望变高季节性:贺岁片、暑期档导演、演员的负面报道导致评分变低 核心思想&#…...

深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过电商、社交网络、物联网等12个行业场景,结合MongoDB聚合管道、Redis Stream实时处理、Cassandra SSTable存储引擎、Neo4j路径遍历算法等42…...

MyBatis 中 SqlMapConfig 配置文件详解

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 configuration&#xff1a;包裹所有配置标签&#xff0c;是整个配置文件的顶级标签。 properties&#xff1a;属性&#xff0c;该标签可以引入外部配置的属性&#xff…...

STM32物联网终端实战:从传感器到云端的低功耗设计

STM32物联网终端实战&#xff1a;从传感器到云端的低功耗设计 一、项目背景与挑战分析 1.1 物联网终端典型需求 &#xff08;示意图说明&#xff1a;传感器数据采集 → 本地处理 → 无线传输 → 云端存储&#xff09; 在工业物联网场景中&#xff0c;终端设备需满足以下核心需…...

SQLite Select 语句详解

SQLite Select 语句详解 SQLite 是一个轻量级的数据库管理系统&#xff0c;以其简洁的设计和高效的性能被广泛应用于各种场景。在 SQLite 中&#xff0c;SELECT 语句是用于查询数据库中的数据的命令。本文将详细介绍 SQLite 的 SELECT 语句&#xff0c;包括其基本语法、常用功…...

[实现Rpc] 客户端划分 | 框架设计 | common类的实现

目录 3. 客户端模块划分 3.1 Network模块 3.2 Protocol模块 3.3 Dispatcher模块 3.4 Requestor模块 3.5 RpcCaller模块 3.6 Publish-Subscribe模块 3.7 Registry-Discovery模块 3.8 Client模块 4. 框架设计 4.1 抽象层 4.2 具象层 4.3 业务层 ⭕4.4 整体设计框架…...

【SFRA】笔记

GK_SFRA_INJECT(x) SFRA小信号注入函数,向控制环路注入一个小信号。如下图所示,当前程序,小信号注入是在固定占空比的基础叠加小信号,得到新的占空比,使用该占空比控制环路。 1.2 GK_SFRA_COLLECT(x, y) SFRA数据收集函数,将小信号注入环路后,该函数收集环路的数据,以…...

基于Python的Diango旅游数据分析推荐系统设计与实现+毕业论文(15000字)

基于Python的Diango旅游数据分析推荐系系统设计与实现毕业论文指导搭建视频&#xff0c;带爬虫 配套论文1w5字 可定制到某个省份&#xff0c;加40 基于用户的协同过滤算法 有后台管理 2w多数据集 可配套指导搭建视频&#xff0c;加20 旅游数据分析推荐系统采用了Python语…...

为什么docker 容器有的没有PORTS

容器的 PORTS 列没有显示端口映射信息&#xff0c;而 sonatype/nexus3:3.77.1 容器有显示&#xff0c;可能是由以下几个原因导致的&#xff1a; 1. --networkhost 参数的使用 正如前面提到的&#xff0c;当你使用 --networkhost 参数运行容器时&#xff0c;容器会直接使用宿主…...

国自然青年基金|针对罕见神经上皮肿瘤的小样本影像深度数据挖掘关键技术研究|基金申请·25-02-15

小罗碎碎念 今天和大家分享一个国自然青年基金项目&#xff0c;执行年限为2021.01&#xff5e;2023.12&#xff0c;直接费用为24万元。 该项目聚焦罕见神经上皮肿瘤小样本影像深度数据挖掘技术&#xff0c;致力于攻克小样本数据和临床经验缺乏带来的难题。项目围绕影像规范化、…...

《解锁自然语言处理:让公众正确拥抱AI语言魔法》

在当今数字化浪潮中&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术作为人工智能领域的璀璨明珠&#xff0c;正以惊人的速度融入我们的生活。从智能语音助手到智能客服&#xff0c;从机器翻译到内容创作辅助&#xff0c;NLP技术无处不在。然而&#xff0c;如同任何强…...

算法刷题-哈希表的总结

什么时候用数组、什么时候用map呢&#xff1f; 经常会混淆。 混淆1&#xff1a;例如有时候题目可能要求在一大堆元素里找目标元素&#xff0c;要求不能利用用过的字母&#xff0c;这就会让我想到只包含一个键值的set或者是map&#xff0c;但实际上忽略了字母&#xff08;限定大…...