当前位置: 首页 > 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…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

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

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

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Python打卡训练营学习记录Day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

如何使用CodeRider插件在IDEA中生成代码

一、环境搭建与插件安装 1.1 环境准备 名称要求说明操作系统Windows 11JetBrains IDEIntelliJ IDEA 2025.1.1.1 (Community Edition)硬件配置推荐16GB内存50GB磁盘空间 1.2 插件安装流程 步骤1&#xff1a;市场安装 打开IDEA&#xff0c;进入File → Settings → Plugins搜…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解​

阅读时长​​ | 8分钟 ​​适用读者​​ | 需要跨境调用OpenAI等AI服务的开发者/企业 ​​一、问题背景&#xff1a;为什么需要代理&#xff1f;​​ 最近在技术社区看到这样的求助&#xff1a; "公司服务器在国内&#xff0c;但业务需要调用OpenAI接口&#xff0c;直接访…...

FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景

一、什么是FTPS&#xff1f; FTPS&#xff0c;英文全称File Transfer Protocol with support for Transport Layer Security (SSL/TLS)&#xff0c;安全文件传输协议&#xff0c;是一种对常用的文件传输协议(FTP)添加传输层安全(TLS)和安全套接层(SSL)加密协议支持的扩展协议。…...