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

stream()流的使用

文章目录

    • 引入流
      • 流的操作
      • 中间操作
      • 终端操作
    • 流的使用
      • 谓词筛选
      • 筛选各异的元素
      • 流的切片
      • 截断流
      • 跳过元素
      • 映射
      • 流的扁平化
      • 查找和匹配
    • 归约
      • 元素求和、最大值和最小值
      • 数值流
      • 构建流
        • 由值构建流
        • 由数组创建流

引入流

  • java api提供的一种利用声明式的方式处理数据集合的一个东西,可以被看成一个高级迭代器

流的操作

流水线:也就是很多流操作本身会返回一个流,可以将多个操作连接起来,形成一个更大的流

  • filter() :谓词过滤,筛选出适合条件的实体
  • sorted():对集合进行排序
  • map():提取某项元素
  • collect():将流转换为其它形式
  • limit():截断流,是元素不超过给定数量
  • 流的迭代是内部迭代,外部迭代一般是有程序员控制的迭代,foreach就属于外部迭代,并且流只能遍历一次

中间操作

  • 像filter、sorted等都会生成一个流,中间操作也就是会将这些流合并成一个流,这个东西也叫做合并循环

终端操作

  • 终端操作会从流水线生成结果,其结果是任何不是流的值,比如List、Integer、void等
//forEach会返回void的终端操作
menu.stream().forEach(System.out.println);

流的使用

谓词筛选

  • 因为流支持filter操作,filter是属于行为参数化的,可以通过谓词来筛选出我们需要的元素

筛选各异的元素

  • 流可以使用distinct()方法,它会返回一个各异元素的流(底层是通过hashcode和equals()实现)

流的切片

  • takewhile(): filter()会把所有的元素都过一遍,如果数据量过大,速度会非常慢,takewhile()当遇到不符合的元素会停止处理,大大节约了时间
  • dropwhile():dropwhile()是对takewhile()的补充,它会丢弃掉谓词为false的元素,当谓词为true,它会停止处理,并返回谓词为false的元素

截断流

  • 上面提到了,对流进行截断,返回给定数量的元素

跳过元素

  • skip(n):跳过给定数量的元素,如果 n 大于元素个数,则会返回一个空的流

映射

映射是指map()操作,它会返回我们指定的元素属性

流的扁平化

flatMap()的作用是,各个数组并不是分别映射成一个流,而是映射成流的内容

例子: 给定一个单词表["Hello", "World"], 想要返回列表['H', 'e', 'l', 'o', 'W', 'r', 'd']第一次尝试:word.stream().map(item->item.split(" ")).distinct().toCollect()map(item->item.split())的返回结果是Stream<String[]>,我们需要的是Stream<String>,distinct操作并不能形成我们想要的结果第二次尝试:word.stream().map(item->item.split(" ")).map(Arrays::stream).distinct().collect()map(Arrays::stream)是将每一个数组变为一个流,并不能达到我们要的结果第三次尝试:word.stream().map(item->item.split(" ")).flatMap(Arrays::stream).distinct().collect()flatMap(Arrays::stream)会将每一个数组的内容分别映射为流的内容,然后将流合并形成一个流,在进行distinct()就可以达到效果

查找和匹配

常见的数据处理的套路是看数据集中的某些元素是否匹配一个给定的元素,Stream Api通过allMatch、anyMatch、noneMatch、findFirst和findAny实现

  • anyMatch():流中是否有一个元素能匹配给定的谓词
  • noneMatch():所有元素是否匹配给定的谓词
  • noneMatch():确保没有元素与给定的谓词匹配
  • findAny():返回当前流的任意元素
  • findFirst():指定流中元素的出现顺序
Optional:一般用来处理空指针异常的,允许程序中出现null了,一般来说查询的返回结果可以给一个OptionalisPresent():有值返回true,没有值返回falseifPresent(Consumer<T> block): 会在存在值的时候执行代码块get(T other): 会在值存在时返回值,不存在值抛出异常orElse(): 存在值就返回值,不存在值就返回一个默认值

归约

将流中的元素反复结合起来,得到一个值,这样的操作叫做归约操作,归约的优势在于内部迭代和并行化,并行化就是将stream()变为parallelStream()

  • reduce(初始值一般为0, 需要的操作)
int sum = numbers.stream().reduce(0, Integer::sum);
//无初始值的情况
Optional<Integer> sum = numbers.stream().reduce((a,b)-> (a+b));

元素求和、最大值和最小值

Optional<Integer> sum = numbers.stream().reduce(0, Integer::sum);
Optional<Integer> max = numbers.stream().reduce(Integer:max);
Optional<Integer> min = numbers.stream().reduce(Integer:min);

数值流

  • mapToInt(): 返回一个IntStream()
  • mapToDouble():返回一个DoubleStream()
  • OptionalInt 的默认值是0,用来求和还行,求最大值不适用
  • rangeClosed(1,100):是IntStream的一个方法,可以规定数值范围
//使用归约求涉及到拆包的问题
int sum = numbers.stream().reduce(0, Integer::sum);
//map的返回值是Stream<类>,不行
Optional<Integer> sum = numbers.stream().map(::方法).sum();
//maptoInt()的返回值是IntStream,还支持max()、min()、average()等
Optional<Integer> sum = numbers.stream().mapToInt(::方法).sum();
//使用orElse来指定OptionalInt的值,如果没有最大值,显方式提供一个默认最大值
OptionalInt<Integer> test = xxx;
int max = test.orElse(1);

构建流

由值构建流

Stream<String> stream = Stream.of("modern", "java", "In", "Action");
stream.map(String :: toUpperCase).forEach(System.out::println);
//创建一个空的流
Stream<String> emptyStream = Stream.empty();

由数组创建流

int[] numbers = {2, 3, 5, 7, 11, 13};
int sum = Arrays.stream(numbers).sum();

相关文章:

stream()流的使用

文章目录引入流流的操作中间操作终端操作流的使用谓词筛选筛选各异的元素流的切片截断流跳过元素映射流的扁平化查找和匹配归约元素求和、最大值和最小值数值流构建流由值构建流由数组创建流引入流 java api提供的一种利用声明式的方式处理数据集合的一个东西&#xff0c;可以…...

C++学习笔记-常量

在程序执行过程中&#xff0c;其值不能改变的量称为常量(Constant)。普通常量的类型是根据数据的书写形式来决定的。如 100 是整型常量&#xff0c;0.5 是实型常量&#xff0c;‘q’ 是字符型常量&#xff0c;“qianfeng” 是字符串常量。 常量是固定值&#xff0c;在程序执行期…...

JavaScript系列之实现继承的几种方式

文章の目录一、借助父构造函数继承属性1、实现方式2、优点3、缺点二、原型链继承1、实现方式2、优点3、缺点三、组合继承四、ES6继承的实现方式参考写在最后一、借助父构造函数继承属性 1、实现方式 先定义一个父构造函数(this指向为window)&#xff1b;再定义一个子构造函数…...

java面试准备

1.自我介绍: 2.基础 : 1.集合 : java容器中分为collection 和map两大类 collection 分为list集合(有序且重复的),set集合(无序,不可重复) list集合分为arrayList集合 : 查询快,增删慢,它是基于数组结构的,对数据的增删是在数组的尾部进行添加或删除的,其效率相对于LinkedList…...

kafka-6-python单线程操作kafka

使用Python操作Kafka&#xff1a;KafkaProducer、KafkaConsumer Python kafka-python API的帮助文档 1 kafka tools连接 (1)/usr/local/kafka_2.13-3.4.0/config/server.properties listeners PLAINTEXT://myubuntu:9092 advertised.listenersPLAINTEXT://192.168.1.8:2909…...

【Spring教程】1.Spring概述

1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…...

设计模式-代理模式

控制和管理访问 玩过扮白脸&#xff0c;扮黑脸的游戏吗&#xff1f;你是一个白脸&#xff0c;提供很好且很友善的服务&#xff0c;但是你不希望每个人都叫你做事&#xff0c;所以找了黑脸控制对你的访问。这就是代理要做的&#xff1a;控制和管理对象。 监视器编码 需求&…...

DPDK — MALLOC(librte_malloc,Memory Manager,内存管理组件)

目录 文章目录 目录MALLOC(librte_malloc,Memory Manager,内存管理组件)rte_malloc() 接口malloc_heap 结构体malloc_elem 结构体内存初始化流程内存申请流程内存释放流程MALLOC(librte_malloc,Memory Manager,内存管理组件) MALLOC 库基于 hugetlbfs 内核文件系统来实…...

【Java开发】Spring 12 :Spring IOC控制反转和依赖注入(解决单接口多实现类调用)

IOC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;Spring 通过 IOC 容器来管理所有 Java 对象的实例化和初始化&#xff0c;控制对象与对象之间的依赖关系。我们将由 IOC 容器管理的 Java 对象称为 Spring Bean&#xff0c;它与使用关键字 new 创建…...

【C++学习】基础语法(三)

众所周知C语言是面向过程的编程语言&#xff0c;关注的是过程&#xff1b;解决问题前&#xff0c;需要分析求解的步骤&#xff0c;然后编辑函数逐步解决问题。C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事拆分成不同的对象&#xff0c;不同对象间交互解决问…...

k8s自动化安装脚本(kubeadm-1.23.7)

文章目录介绍软件架构版本介绍更新内容2023-02-192023-02-152023-02-142023-02-102022-10-202022-08-06准备部署包操作步骤环境准备结构备注解压部署包修改host文件脚本使用方式初始化环境验证ansible配置安装k8s集群登录master的节点添加node节点master节点状态检查组件安装安…...

面试题记录

Set与Map的区别 map是键值对&#xff0c;set是值的集合。键&#xff0c;值可以是任何类型map可以通过get获取&#xff0c;map不能。都能通过迭代器进行for…of遍历set的值是唯一的&#xff0c;可以做数组去重&#xff0c;map&#xff0c;没有格式限制&#xff0c;可以存储数据…...

链式前向星介绍以及原理

1 链式前向星 1.1 简介 链式前向星可用于存储图&#xff0c;本质上是一个静态链表。 一般来说&#xff0c;存储图常见的两种方式为&#xff1a; 邻接矩阵邻接表 邻接表的实现一般使用数组实现&#xff0c;而链式前向星就是使用链表实现的邻接表。 1.2 出处 出处可参考此…...

jenkins 安装 -适用于在线安装 后续写个离线安装的

jenkins安装1.下载jenkins2.安装启动3.附件卸载jdk的命令4.配置jenkins一、在jenkins配置文件中配置jdk环境变量二、修改jenkins默认的操作用户1.下载jenkins jenkins官网下载 https://www.jenkins.io/ 点击下载 我是centos系统所以选择centos&#xff0c;点击后按着官方提供…...

【C++】再谈vscode界面调试C++程序(linux) - 知识点目录

再谈vscode界面调试C程序&#xff08;linux&#xff09; 配套文档&#xff1a;vscode界面调试C程序&#xff08;linux&#xff09; 命令解释 g -g ../main.cpp 编译main.cpp文件&#xff1b; -g&#xff1a;生成调试信息。编译器会在可执行文件中嵌入符号表和源代码文件名&…...

蚂蚁感冒---第五届蓝桥杯真题

目录 题目链接 题目描述 分析&#xff1a; 代码&#xff1a; y总综合​ 666 题目链接 1211. 蚂蚁感冒 - AcWing题库 题目描述 分析&#xff1a; y总真牛逼&#xff0c;掉头等价于穿过&#xff0c;以第一个点为分界点&#xff0c;分别判断 代码&#xff1a; &#xff08;自…...

常见排序算法--Java实现

常见排序算法--Java实现插入排序直接插入排序折半插入排序希尔排序交换排序冒泡排序快速排序选择排序直接选择排序堆排序归并排序基数排序各种排序方法比较在网上找了些排序算法的资料。此篇笔记本人总结比较&#xff0c;简单注释&#xff0c;觉得比较好理解&#xff0c;且相对…...

算法笔记(九)—— 暴力递归

暴力递归&#xff08;尝试&#xff09; 1. 将问题转化为规模缩小了的同类问题子问题 2. 有明确的不需要的继续递归的条件 3. 有当得到子问题结果之后的决策过程 4. 不记录每一个子问题的解 Question&#xff1a;经典汉诺塔问题 1. 理解清楚&#xff0c;基础三个圆盘的移动…...

Flask框架学习记录

Flask项目简要 项目大致结构 flaskDemo1 ├─static ├─templates └─app.py app.py # 从flask这个包中导入Flask类 from flask import Flask# 使用Flask类创建一个app对象 # __name__:代表当前app.py这个模块 # 1.以后出现bug&#xff0c;可以帮助快速定位 # 2.对于寻找…...

【Opencv 系列】 第6章 人脸检测(Haar/dlib) 关键点检测

本章内容 1.人脸检测&#xff0c;分别用Haar 和 dlib 目标&#xff1a;确定图片中人脸的位置&#xff0c;并画出矩形框 Haar Cascade 哈尔级联 核心原理 &#xff08;1&#xff09;使用Haar-like特征做检测 &#xff08;2&#xff09;Integral Image : 积分图加速特征计算 …...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...