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

Stream流操作

 准备工作

准备 Gender 枚举类以及 Customer 类

enum Gender {MALE("男性"), FEMALE("女性");private String value;Gender() {}Gender(String value) {this.value = value;}@Overridepublic String toString() {return "Gender{" +"value='" + value + '\'' +'}';}
}
class Customer {private String name;private Gender gender;public Customer() {}public Customer(String name, Gender gender) {this.name = name;this.gender = gender;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Gender getGender() {return gender;}public void setGender(Gender gender) {this.gender = gender;}@Overridepublic String toString() {return "Customer{" +"name='" + name + '\'' +", gender=" + gender +'}';}
}

Stream 介绍

  • java.util.Stream表示能应用在一组元素上一次执行的操作序列。
  • Stream操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,可以连续完成多个操作。

创建 Stream 流

创建数据流的方式一

//        创建数据流方法一 使用集合.stream()
List<String> list = Arrays.asList("c", "c++", "c#", "java", "python", "go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "b");
list.stream();

创建数据流的方式二

//        创建数据流方法二 使用Stream.of()
Stream<String> stream2 = Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B");

常用方法

1. forEach 遍历方法

重写 Consumer 函数式接口中的 apply() 方法

List<String> list = Arrays.asList("c", "c++", "c#", "java", "python", "go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "b");
Stream<String> stream1 = list.stream();
stream1.forEach(System.out::println);
2. filter 过滤方法

按照条件过滤掉出我们需要的数据

List<String> list = Arrays.asList("c", "c++", "c#", "java", "python", "go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "b");
Stream<String> stream1 = list.stream();
stream1.filter((lang) -> {return lang.length() > 3;
})
.distinct()  //去重
.forEach(System.out::println);
3. sorted 排序方法

重写Comparator函数式接口中的compare()方法

Stream<String> stream2 = Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B");
//        获得包含大写字母的并且排序
stream2.filter((lang) -> {for (int i = 0; i < lang.length(); i++) {if (lang.charAt(i) >= 'A' && lang.charAt(i) <= 'Z') {return true;}}return false;
}).sorted((o1, o2) -> {int compare = o1.compareTo(o2);if (compare == 0) {return o1.length() - o2.length();} else {return compare;}
}).forEach((lang) -> {System.out.println(lang);
});
4. map 映射方法

映射 对流中的数据进行处理(加减乘除等等操作)

// 将集合中的数据每个都 +1
List<Integer> numList = Arrays.asList(90, 100, 10, 20, 30, 50, 60, 70, 80);
numList.stream().map((num) -> {return num + 1;
}).forEach(System.out::println);
5. match 匹配方法
  • 返回值是一个 boolean 类型
  • 重写函数式接口Predicate接口中的 test()方法
  1. allMatch()全部匹配,只有集合中的数据全部匹配我们的条件才会返回 true
List<String> strings = Arrays.asList("abc", "defs", "gkh", "abc");
boolean bool = strings.stream().allMatch((s) -> {return s.length() == 3;
});
System.out.println(bool);

运行结果为 false 因为有一个数据的长度是 4

  1. anyMatch()部分匹配,只要集合中的数据有一个匹配我们的条件就返回 true
List<String> strings = Arrays.asList("abc", "defs", "gkh", "abc");boolean bool = strings.stream().anyMatch((s) -> {return s.length() == 3;
});
System.out.println(bool);
6. count 计数方法

用来统计个数类似于 sql中的聚合函数 count

/*** 计数 count()* 统计所有女生的数量*/
List<Customer> customerList = Arrays.asList(new Customer("白骨精", Gender.FEMALE),new Customer("女儿国国王", Gender.FEMALE),new Customer("擎天柱", Gender.MALE),new Customer("蛇精", Gender.FEMALE),new Customer("金刚葫芦娃", Gender.MALE));
//        先过滤在统计
long count = customerList.stream().filter((customer) -> {return customer.getGender().equals(Gender.MALE);
}).count();
System.out.println(count);
7. collect 收集方法
  • toMap() 收集每个元素的长度(元素为 key,长度为 value)转换成一个 map
Map<String, Integer> map = Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.distinct() //去重 因为这里不能做到覆盖操作 键重复会报错
.collect(Collectors.toMap((s) -> {return s;
}, (s) -> {return s.length();
}));
System.out.println(map);
  • mapping()映射方法

Stirng 类型的元素转换成 int 类型并且都乘以 100

List<Integer> integerList = Stream.of("10", "20", "60", "50", "70", "90")
.collect(Collectors.mapping((s) -> {return Integer.parseInt(s) * 100;
}, Collectors.toList()));
integerList.forEach(System.out::println);
  • groupingBy()分组操作,可按条件分为若干组
  1. 按照元素的长度分组
Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.collect(Collectors.groupingBy((s) -> {return s.length();   // 按照元素的长度分组
}))
.forEach((k, v) -> {System.out.println(k + ":" + v);
});
  1. 按照元素的首字母分组
Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.collect(Collectors.groupingBy((s) -> {return s.charAt(0);
}))
.forEach((k, v) -> {System.out.println(k + ":" + v);
});
  • partitioningBy()分区操作 将元素按条件分为两区,一区是符合条件的,一 区 是不符合条件的
Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.collect(Collectors.partitioningBy((s) -> {return s.length() >= 3;
})).forEach((k, v) -> {System.out.println(k + ":" + v);
});
8. 统计操作

常见的有 mapToInt()mapToDouble()mapToLong()

这里使用的是mapToInt()

统计操作可以获得元素的最大值、最小值、平均值、累加值、以及元素个数

List<Integer> numList1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
//        stream ==> IntStream
IntStream intStream = numList1.stream().mapToInt((n) -> {return n;
});
//        获得统计结果
IntSummaryStatistics statistics = intStream.summaryStatistics();
System.out.println("最大值" + statistics.getMax());
System.out.println("最小值" + statistics.getMin());
System.out.println("平均值" + statistics.getAverage());
System.out.println("累加值" + statistics.getSum());
System.out.println("元素个数" + statistics.getCount());

相关文章:

Stream流操作

准备工作 准备 Gender 枚举类以及 Customer 类 enum Gender {MALE("男性"), FEMALE("女性");private String value;Gender() {}Gender(String value) {this.value value;}Overridepublic String toString() {return "Gender{" "value&qu…...

【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法

这个方法是摸索出来的&#xff0c;也不一定对&#xff1a; 1、驱动层module_init(module_init_function)作为模块初始化&#xff0c;并且提供模块内部初始化的函数名&#xff1b; 2、找到所有驱动目录drivers下所有module_init(module_init_function)&#xff0c;在内核6.9.0…...

快速入门Vue

Vue是什么 Vue.js&#xff08;通常简称为Vue&#xff09;是一个开源的JavaScript框架&#xff0c;用于构建用户界面和单页应用程序&#xff08;SPA&#xff09;。它由尤雨溪&#xff08;Evan You&#xff09;在2014年开发并发布。Vue的核心库只关注视图层&#xff0c;易于上手…...

ubuntu系统服务器离线安装python包

一、根据工程需要本地下载所需python包 1. 下载环境requirements.txt pip freeze > requirements.txt2. 根据requirements.txt下载python包 注意&#xff1a;查看服务器属于x_86架构还是arm架构、cpython还是pypy 2.1 确定服务器架构&#xff08;终端输入&#xff09; …...

re题(30)BUUCTF-[HDCTF2019]Maze

BUUCTF在线评测 (buuoj.cn) 查一下壳&#xff0c;32位upx壳 脱完壳放到ida&#xff0c;shiftF12看一下字符串&#xff0c;是个迷宫&#xff0c;maze&#xff08;迷宫&#xff09; 这里有一个经典的花指令 (导致找不到main函数) 下方有个奇怪的jnz指令&#xff0c;它跳转到了下…...

day36+day37 0-1背包

### 9.9 01背包问题&#xff08;一维二维&#xff09; 背包问题分类&#xff1a;01背包&#xff08;一种物品只有一个&#xff09;&#xff0c;完全背包&#xff08;一种物品有无数个&#xff09;&#xff0c;多重背包&#xff08;不同物品有不同数量&#xff09; 46. 携带研究…...

PostMan使用变量

环境变量 使用场景 当测试过程中&#xff0c;我们需要对开发环境、测试环境、生产环境进行测试 不同的环境对应着不同的服务器&#xff0c;那么这个时候我们就可以使用环境变量来区分它们 避免切换测试环境后&#xff0c;需要大量的更改接口的url地址 全局变量 使用场景 当…...

多线程同步

多线程 程序中默认只有一个线程&#xff0c;pthread_create()函数调用后就有2个线程。 pthread_create() #include <pthread.h> #include <string.h> #include <unistd.h> #include <iostream> using namespace std; //线程函数 void * callback(vo…...

第159天:安全开发-Python-协议库爆破FTPSSHRedisSMTPMYSQL等

案例一: Python-文件传输爆破-ftplib 库操作 ftp 协议 开一个ftp 利用ftp正确登录与失败登录都会有不同的回显 使用ftplib库进行测试 from ftplib import FTP # FTP服务器地址 ftp_server 192.168.172.132 # FTP服务器端口&#xff08;默认为21&#xff09; ftp_po…...

软件测试 | APP测试 —— Appium 的环境搭建及工具安装教程

大家应该都有同一种感觉&#xff0c;学习appium最大的难处之一在于环境的安装&#xff0c;安装流程比较繁琐&#xff0c;安装的工具和步骤也较多&#xff0c;以下是基于Windows系统下的Android手机端的安装流程。就像我们在用Selenium进行web自动化测试的时候一样&#xff0c;我…...

计算机人工智能前沿进展-大语言模型方向-2024-09-13

计算机人工智能前沿进展-大语言模型方向-2024-09-13 1. OneEdit: A Neural-Symbolic Collaboratively Knowledge Editing System Authors: Ningyu Zhang, Zekun Xi, Yujie Luo, Peng Wang, Bozhong Tian, Yunzhi Yao, Jintian Zhang, Shumin Deng, Mengshu Sun, Lei Liang, Z…...

衡石分析平台使用手册-替换衡石minio

替换衡石minio​ 在使用HENGSHI SENSE服务过程中&#xff0c;可以根据业务需要替换HENGSHI自带的minio。本文讲述使用Aws S3和Aliyun OSS替代衡石minio的过程。 准备工作​ 在进行配置前&#xff0c;请在aws s3或aliyun oss完成如下准备工作。 创建access_key和secret_acces…...

怎么将几个pdf合成为一个?把几个PDF合并成为一个的8种方法

怎么将几个pdf合成为一个&#xff1f;将多个PDF文件合并成一个整体可以显著提高信息整合的效率&#xff0c;并简化文件的管理与传递。例如&#xff0c;将不同章节的电子书合成一本完整的书籍&#xff0c;或者将多个部门的报告整合成一个统一的文档&#xff0c;可以使处理流程变…...

明明没有程序占用端口,但是启动程序却提示端口无法使用,项目也启动失败

明明没有程序占用端口&#xff0c;但是启动程序却提示端口无法使用&#xff0c;项目也启动失败 win10、端口占用、port、netstat、used背景 曾在springboot中遇到过&#xff0c;新建spring cloud时又遇到这个问题&#xff0c;如果不从根本上解决&#xff0c;就需要改端口&…...

ClickHouse的安装配置+DBeaver远程连接

1、clickhouse的下载&#xff1a; 先去clickhouse官网进行下载&#xff0c;继续往下翻找文档&#xff0c;将DBeaver也下载下来 下载地址&#xff1a;https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…...

UVM仿真的运行(四)—— objection 机制

目录 0. 引言 1. uvm_phase::execute_phase line 1432~1470 2. uvm_objection 2.1 get_objection_total 2.2 raise_objection 2.3 drop_objection 2.4 m_execute_scheduled_forks 2.5 wait_for 3. 小结 0. 引言 前面介绍了uvm仿真的启动,按照domain中指定的DAG的pha…...

【ShuQiHere】算法分析:揭开效率与复杂度的神秘面纱

【ShuQiHere】 &#x1f680; 引言 在计算机科学的世界中&#xff0c;算法 是每一个程序背后的隐形支柱。从简单的排序到复杂的人工智能&#xff0c;算法无处不在。然而&#xff0c;编写一个能运行的程序只是开始&#xff0c;当程序面对庞大的数据集时&#xff0c;算法的效率…...

记忆化搜索专题——算法简介力扣实战应用

目录 1、记忆化搜索算法简介 1.1 什么是记忆化搜索 1.2 如何实现记忆化搜索 1.3 记忆化搜索与动态规划的区别 2、算法应用【leetcode】 2.1 题一&#xff1a;斐波那契数 2.1.1 递归暴搜解法代码 2.1.2 记忆化搜索解法代码 2.1.3 动态规划解法代码 2.2 题二&#xff1…...

【Java】【力扣】83.删除排序链表中的重复元素

题目 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输出&#…...

vue3项目实现全局国际化

本文主要梳理vue3项目实现全项目格式化&#xff0c;例如在我前面文章使用若依创建vue3的项目中&#xff0c;地址&#xff1a;若依搭建vue3项目在导航栏中切换&#xff0c;页面中所有的组件的默认语言随之切换&#xff0c;使用的组件库依旧是element-plus&#xff0c;搭配vue-i1…...

掌握LiteDB.Studio:嵌入式文档数据库可视化管理工具全攻略

掌握LiteDB.Studio&#xff1a;嵌入式文档数据库可视化管理工具全攻略 【免费下载链接】LiteDB.Studio A GUI tool for viewing and editing documents for LiteDB v5 项目地址: https://gitcode.com/gh_mirrors/li/LiteDB.Studio 在现代软件开发中&#xff0c;嵌入式数…...

Qwen3.5-4B-Claude-Opus保姆级教程:Web端UI功能分区与高级参数联动说明

Qwen3.5-4B-Claude-Opus保姆级教程&#xff1a;Web端UI功能分区与高级参数联动说明 1. 模型与平台介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型&#xff0c;重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能…...

OpenTelemetry Profiles 信号进入 Alpha 阶段:Elastic 对性能分析的持续承诺

作者&#xff1a;来自 Elastic Christos Kalkanis&#xff0c;Florian Lehner 及 Roger Coll OpenTelemetry Profiles 已正式达到 Alpha 阶段&#xff0c;将性能分析确立为第四种可观测性信号。Elastic 的核心贡献包括其 eBPF 性能分析代理、持续的 OpenTelemetry Profiles 信号…...

矿井排水系统直接关系到煤矿安全生产,今天咱们掰开揉碎了聊聊西门子S7-200 PLC控制三台水泵的实战经验。老规矩,先上干货再说原理

基于西门子PLC的煤矿排水系统控制&#xff0c;内容包括 [1]S7-200 PLC程序[2]MCGS6.2组态画面[3]电气图纸精品文档 共有3台水泵进行矿井排水&#xff0c;分别为1号水泵&#xff0c;2号水泵&#xff0c;3号水泵 其中1号&#xff0c;2号水泵是工作水泵&#xff0c;3号水泵是备用水…...

Intv_AI_MK11嵌入式开发实战:在WSL2中部署AI模型并集成Keil5

Intv_AI_MK11嵌入式开发实战&#xff1a;在WSL2中部署AI模型并集成Keil5 1. 为什么选择WSL2进行嵌入式AI开发 对于嵌入式开发者来说&#xff0c;传统AI模型开发面临一个典型困境&#xff1a;训练环境通常基于Linux系统&#xff0c;而嵌入式开发工具链&#xff08;如Keil MDK&…...

OpenClaw 入门完整教程:从零搭建自托管AI网关

OpenClaw入门到实战&#xff1a;自托管AI网关完整部署指南 作者&#xff1a;鲲鹏AI探索局 | 标签&#xff1a;OpenClaw, AI Agent, 自托管, 多平台聊天, 网关部署 摘要 本文详细介绍OpenClaw——一个开源自托管AI网关的安装、配置和实战部署全过程。通过实际案例演示如何连接T…...

原神高帧率解锁终极方案:一键突破60帧限制的完全指南

原神高帧率解锁终极方案&#xff1a;一键突破60帧限制的完全指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 想象一下这样的场景&#xff1a;你在蒙德的原野上自由奔跑&#xff0c;角…...

高并发分布式存储系统的设计与实践

高并发分布式存储系统的设计与实践 背景 最近团队需要设计一个支持高并发写入的分布式存储系统&#xff0c;用于处理每天数万亿条数据的写入和查询需求。作为一个在分布式存储领域深耕多年的技术人&#xff0c;我决定分享一下高并发分布式存储系统的设计思路和实践经验。 核心挑…...

深入OpenHarmony NAPI引擎:从‘@ohos.hilog’导入到so库加载的底层链路剖析

深入OpenHarmony NAPI引擎&#xff1a;从‘ohos.hilog’导入到so库加载的底层链路剖析 当开发者在OpenHarmony应用中写下import hilog from ohos.hilog时&#xff0c;背后隐藏着一套精密的系统级协作机制。这条看似简单的语句&#xff0c;实际上触发了从JavaScript语法解析到原…...

2026全年求职时间线|应届生必看,错过可能再等一年

关注 霍格沃兹测试学院公众号&#xff0c;回复「资料」, 领取人工智能测试开发技术合集如果你是2026届、2027届毕业生&#xff0c;这篇文章建议收藏转发。应届生身份只有一次&#xff0c;用好了是红利&#xff0c;用错了可能错过一整年机会。都说今年工作难找&#xff0c;那我们…...