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

手把手教会你 - StreamAPI基本用法

1. 简介

目前响应式编程的学习中很多时候都用到了Lambda表达式和StreamAPI,那么今天就在这里记录一下一些最基本的使用方法。
StreamAPI中引入了流的概念,其将集合看作一种流,流在管道中传输(动态的),可以在管道的不同节点上进行处理,如筛选、排序、聚合等。

  1. 流的三部分 数据流、N个中间操作、一个终止操作
  2. 流需写成一个整体,因为流的所有操作是无状态的,数据状态仅在当前流内有效,外部不要对流中的操作产生影响比如增删改啥的
  3. 流一些操作默认跟for循环差不多(单线程,流中的每个元素要完整经过一边流操作才能到下一个元素),要想多线程要调用 parallel() 操作,使得其变成一个并发流,但与此同时也需要取解决线程安全问题(加锁)
  4. 流在大数据量的时候比for循环效率高(stream作为一个管道,其中定义了一系列回调函数,可以理解为没有事就不做事,有事的时候jvm底层自动帮我们调用)

2. 数据流的创建

Stream<Integer> stream1 = Stream.of(1,2,3);Stream<Integer> stream2 = Stream.concat(Stream.of(2,3,4), stream1);
// 调用构造器方法,记得最后要调用build()方法
Stream<Object> stream3 = Stream.builder().add("11").add("12").build();//常用: 调用集合容器本身的stream()方法
//list
List<Integer> list = List.of(1,2);
Stream<Integer> stream4 = list.stream();//set
Set<Integer> set = Set.of(1,2);
Stream<Integer> stream5 = set.stream();//map 分别获取key和value的集合后再stream
Map<Object,Integer> map;
Stream<Object> stream6 = map.keySet().stream();
Stream<Integer> stream7 = map.values().stream();

3. 中间操作

  • filter: 过滤,选出需要的元素
  • map: 映射,而且事一一映射
    • mapToInt、mapToLong、mapToDouble
  • flatMap:一对多映射
// 自己定义一个Person类
List<Person> list = List.of(new Person("charles bibi",11),new Person("katie pesto",12),new Person("paul garba",13),new Person("peter park",14),new Person("rachel chen",15),);list.stream().skip(1) // 跳过前面i个元素.filter(person -> person.getAge() > 13) // 过滤获取年龄大于13的人.map(person -> person.getName) // 获取年龄大于13的人的名字,这时候就是Stream<String>了.peek(System.out::println) // peek方法对每个元素执行操作,但不改变元素本身。.flatMap(name -> {String[] temp = name.split(" "); // 根据空格切分,获得姓和名return Arrays.stream(temp);}).distinct() // 去重.foreach(System.out::println); // 输出来看一看

3.1 takeWhile()

takewhile()方法当不满足操作时直接结束流操作,而filter()方法无条件执行每一个元素

List<Integer> collect = List.of(1,2,3,4,5,6).stream().sorted() // 进行排序(默认降序).takewhile(i -> i>2).collect(Collectors.toList()); 

4. 终止操作(一些简单的就不实现啦,基本没有参数直接调用)

  1. forEach: 对每个元素执行操作。
  2. toArray: 将流元素转化为数组。
// 创建一个整数流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用toArray方法将流转换为数组
Integer[] array = numberStream.toArray(Integer[]::new);
  1. reduce: 使用BinaryOperator组合流元素。
// 创建一个整数流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用reduce方法将流中的元素组合起来生成一个值
// 第一个参数为累积操作的初始值0, 第二个为改变初始值的方法
int sum = numberStream.reduce(0, (a, b) -> a + b);
  1. collect: 将流元素收集到某些数据结构中,如List、Set或自定义数据结构。
  2. min/max: 查找流中的最小或最大元素。
// 创建一个整数流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用max方法获取流中的最大值
// Integer::compareTo方法引用作为比较器。并通过orElse方法处理可能的空值情况
int maxValue = numberStream.max(Integer::compareTo).orElse(0);
  1. count: 计算流中的元素数量。
  2. anyMatch/allMatch/noneMatch: 检查流中是否至少有一个元素满足条件,所有元素都满足条件,或者没有元素满足条件。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 是否有大于3的元素, 返回boolean值
boolean anyMatch = numbers.stream().anyMatch(number -> number > 3);
  1. findFirst/findAny: 查找流中的第一个元素或者任意一个元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Optional<Integer> anyNumber = numbers.stream().filter(number -> number % 2 == 0).findAny();if (anyNumber.isPresent()) {System.out.println("找到的任意一个偶数:" + anyNumber.get());
} else {System.out.println("没有找到偶数");
}
  1. forEachOrdered: 以遇到的顺序对流中的每个元素执行操作,与forEach类似但有顺序保证。

相关文章:

手把手教会你 - StreamAPI基本用法

1. 简介 目前响应式编程的学习中很多时候都用到了Lambda表达式和StreamAPI&#xff0c;那么今天就在这里记录一下一些最基本的使用方法。 StreamAPI中引入了流的概念&#xff0c;其将集合看作一种流&#xff0c;流在管道中传输&#xff08;动态的&#xff09;&#xff0c;可以…...

和为K的子数组

题目&#xff1a; 使用前缀和的方法可以解决这个问题&#xff0c;因为我们需要找到和为k的连续子数组的个数。通过计算前缀和&#xff0c;我们可以将问题转化为求解两个前缀和之差等于k的情况。 假设数组的前缀和数组为prefixSum&#xff0c;其中prefixSum[i]表示从数组起始位…...

Redis:java中redis的基本使用(springboot)

文章目录 springboot中使用redisspringboot 连接 redis三种方式导入依赖增删改查小练习 springboot中使用redis springboot 连接 redis三种方式 jedis &#xff08;redis官方提供的&#xff09;springboot自带的redisson (基于jedis优化的&#xff0c;性能最好&#xff0c;使…...

微型计算机技术

摘要&#xff1a;微型计算机是通用计算机的一个重要发展分支,自1981年美国IBM公司推出第一代商用微型计算机以来,微型计算机迅速进入社会各个领域,且技术不断更新、产品快速换代,已成为人们工作和生活中不可缺少的基本工具。 一、微型计算机技术发展历史 1.第一代微处理器(19…...

mysql下载教程

什么是mysql MySQL是一种开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现在由Oracle公司维护。MySQL支持多个操作系统&#xff0c;包括Linux、Windows、macOS等。它是一种客户端/服务器模式的数据库&#xff0c;提供高效、可靠、稳定的数据存储和…...

ResponseStatusException

目录 概述&#xff1a; 综合实例&#xff1a; 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…...

第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例

吴用说只有公孙胜可以破法术&#xff0c;于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经&#xff0c;于是到了二仙山&#xff0c;并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州&#xff0c;公孙胜说听师傅的。罗真人说出家人不管闲事&a…...

CSAPP-程序的机器级表示

文章目录 概念扫盲思想理解经典好图安全事件 概念扫盲 1.汇编代码使用文本格式&#xff0c;相较于汇编的二进制可读性更好 2.程序内存包括&#xff1a;可执行的机器代码、操作系统需要的信息、管理过程调用和返回的运行时栈、用户分配的内存块 3.链接器为函数调用找到匹配的可…...

TCP传输收发

TCP通信: TCP发端: socket connect send recv close TCP收端: socket bind listen accept send recv close 1.connect int connect(int sockfd, const struct sockaddr *addr, socklen_t ad…...

OJ习题之——圆括号编码

圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码&#xff1a; &#xff08;1&#xff09;用一个整数序列Pp1 p2 … pn编码&#xff0c;pi代表在S中第i个右圆括号的左圆括号数量。&#xff08;记为…...

Android耗电分析之Battery Historian工具使用

Battery-Historian是谷歌推出的一款专门分析Bugreport的工具&#xff0c;是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具&#xff0c;是一款对于分析手机状态&#xff0c;历史运行情况很好的可视化分析工具。 …...

vue el-avatar 使用require提示无法找到图片

报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案...

深入理解 C# 中的 Task:异步编程的利器

深入理解 C# 中的 Task&#xff1a;异步编程的利器 前言一、Task 的基本概念什么是 Task&#xff1f;为什么要使用 Task&#xff1f; Task 的使用方法创建 Task等待 Task 完成Task 返回结果 Task 的进阶用法Task 异常处理Task 同步执行Task 并发限制 Task 的实际应用场景并行计…...

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来&#xff0c;已经在目标检测领域取得了显著的进展&#xff0c;以其快速和准确的特点而广受欢迎。 论文地址&#xf…...

OpenStack之Nova

一 、Nova 使用OpenStack Compute来托管和管理云计算系统。 OpenStack Compute是基础架构即服务 &#xff08;IaaS&#xff09;系统的主要部分。 主要模块在Python中实现&#xff1a; 1因为认证&#xff0c;与OpenStack 身份认证keystone 交互。 2因为磁盘和服务器镜像&#xf…...

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球&#xff0c;给人留下深刻的印象。作为前端开发人员&#xff0c;可以通过不断学习和掌握设计技巧和工具&#xff0c;提升自己的UI设计能力&#xff0c;为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议&#xff1a; 学习设计基础知…...

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…...

【LeetCode】升级打怪之路 Day 14:二叉树的遍历

今日题目&#xff1a; 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …...

[Unity实战]使用NavMeshAgent做玩家移动

其实除了Character Controller, Rigidbody&#xff0c;我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方&#xff08;毕竟基于烘焙过的导航网格&#xff09;&#xff0c;一般常见于元宇宙应用和mmo。 根据Unity手册&#xff0c;NavMeshAgent 也有和…...

官网:随便搞个?那不如不搞,搞不好就给公司减分了。

官网建设确实需要认真对待&#xff0c;不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响&#xff0c;降低品牌形象和用户体验。以下是一些官网建设的重要原则&#xff1a; 专业性&#xff1a;官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...