记一下 Stream 流操作

Java Stream流

创建流

Collection.stream() / Collection.parallelStream():从集合生成流,后者为并行流。

List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

Arrays.stream(T[] array):从数组生成流。

Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);

IntStream.range(int startInclusive, int endExclusive):生成一个包含从startInclusive到endExclusive(不包括)的整数序列的流。

Stream.of(T… values):从给定值创建流。

Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println); // 0 2 4 6 8 10
Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);

中间操作

filter 过滤

filter:用于对Stream流中的数据进行过滤
filter(Predicate<? super T>predicate)
filter方法的参数Predicate是一个函数式接口,可以使用lambda表达式
Predicate中的抽象方法
boolean test(T t)

List<User> user1 = new ArrayList<>();// 基础for (User user : users) {if (user.getId()%2==0){user1.add(user);}}//1:lambdaList<User> user2 = users.stream().filter((user)->user.getId()%2==0).collect(Collectors.toList());//2: 匿名内部类 重写 Predicate#testList<User> user3 = users.stream().filter(new Predicate<User>() {@Overridepublic boolean test(User user) {return user.getId()%2==0;}}).collect(Collectors.toList());//3: 方法引用 需要在 User类中 新增boolean isEven(User user) 方法//List<User> user4 = users.stream().filter(User::isEven).collect(Collectors.toList());

distinct 去重


list1.stream().distinct().collect(Collectors.toList());注:对于基本数据类型通过 == 判定值是否相同。引用数据类型通过其 equals() 方法判定。

limit 截取

limit:用于截取流中的元素
limit可以对流进行截取,只取用前n个
limit(long maxSize); [0,maxSize)
参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作
limit是一个延迟方法,可以继续使用Stream流方法


list1.stream().limit(2).collect(Collectors.toList());

skip 跳过

skip :用于截取流中的元素
skip 可以对流进行截取,只取用前n个
skip (long minSize); [minSize,-1]
参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作


list1.stream().skip(2).collect(Collectors.toList());

sorted 排序

sorted 对流中的内容进行排序
对于基本数据类型直接比较排序
对于对象则需要对象实现对应的 compareTo 接口才能直接调用比较方法

list.stream().sorted().collect(Collectors.toList()); // 默认升序     list.stream().sorted(Comparator.comparing(Integer::intValue)).collect(Collectors.toList());list.stream().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.toList());// 根据返回值判定 正-升,0-等,负-降list.stream().sorted(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}
}).collect(Collectors.toList());//对于实体类 
users.stream().sorted().collect(Collectors.toList()); //该类必须实现 compareTo 接口users.stream().sorted(Comparator.comparing(User::getId)).collect(Collectors.toList());users.stream().sorted((o1, o2) -> o1.getAccount().compareTo(o2.getAccount())).collect(Collectors.toList());users.stream().sorted(new Comparator<User>() {@Overridepublic int compare(User o1, User o2) {return o1.getId().compareTo(o2.getId());}
}).collect(Collectors.toList());

reduce统计

users.stream().map(User::getId).collect(Collectors.toList());
users.stream().map(user -> user.getId()).reduce((o1, o2) -> o1+o2);

终止操作

forEach遍历

users.stream().forEach();

list 转 list

最终结果或流内容提取

list.stream().map(User::getId).collect(Collectors.toList());```

List 转 Map

从流内容中获取关注部分

Map<Long, User> collect = users.stream().collect(Collectors.toMap(user -> user.getId(), user -> user));

anyMatch 短路匹配

匹配到一个就返回 true

users.stream().anyMatch(user -> user.getName().length()==3)

allMatch 全部匹配

所有的都要满足条件才返回true

sers.stream().allMatch(user->user.getId()>1)

findAny/findFirst 查找

  //随机获取流中的一个元素,串行流为第一个,并行流可能随机Optional<User> any = users.stream().findAny();User user1 = any.get();//ifPresent 如果存在则执行users.stream().findAny().ifPresent(user -> System.out.println(user));//findFirst 不论串行、并行都获取第一个users.stream().findFirst().ifPresent(user -> System.out.println(user));

收集齐中joining() 方法

list.stream().map(String::valueOf).collect(Collectors.joining("-"));
users.stream().map(user -> user.getName()).collect(Collectors.joining("-"));0-1-2-3-4-5-6-7-8-9
岇鶯翰-逼隗埈蝠-飇冼剉-丟诈乴喪-餢鞋損-辶陀膗葷-铚鈭膕-痷鰎墕熢-釅烸麉-搂軄汿榿

分组 Collectors.groupingBy()

items.stream().collect(Collectors.groupingBy(Function.identity()));
list.stream().collect(Collectors.groupingBy(User::getSex));
Map<String, Long> result2 = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));  

最值max,min

从流中获取最大的值

list.stream().max(Comparator.comparing(Integer::intValue)).get();// 9
users.stream().max(Comparator.comparing(User::getId)).get(); // id10
users.stream().min(Comparator.comparing(User::getAccount)).get();  // id9
users.stream().max(((o2, o1) -> o1.getId().compareTo(o2.getId()))).get(); //id 1
users.stream().min(((o2, o1) -> o1.getId().compareTo(o2.getId()))).get(); //id 10注:需要传入一个比较器,因此取到的最大值不一定就是真的最大值,根据你的比较器做的选值(源码如下截图);

在这里插入图片描述

复合使用(实战)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 NFTScan NFT API 在 Sei 网络上开发 Web3 应用

Sei Network 是一个专为交易而设计的 Layer 1 区块链。它建立在 Cosmos SDK 上&#xff0c;使用一种称为 Tendermint BFT 的新型共识机制。不仅专攻 DeFi 领域的加密资产交易&#xff0c;更在游戏、社交媒体和 NFTs 等热门 verticals 构建了多功能区块链生态系统。Sei Network …

Day15—热点搜索词统计

一、要求 根据用户上网的搜索记录对每天的热点搜索词进行统计&#xff0c;以了解用户所关心的热点话题。 要求完成&#xff1a;统计每天搜索数量前3名的搜索词&#xff08;同一天中同一用户多次搜索同一个搜索词视为1次&#xff09;。 二、数据 三、配置scala环境 1.下载sca…

网站制作和推广

在当今数字化时代&#xff0c;拥有一个网站对于企业的发展和推广来说是至关重要的。网站既可以作为一个企业的形象展示&#xff0c;也可以作为一个销售渠道&#xff0c;更可以作为一个品牌传播的平台。在本文中&#xff0c;我们将讨论网站制作和推广的重要性&#xff0c;以及一…

08较成功的降低干扰获得较好的波形

08较成功的降低干扰获得较好的波形 波形数据当前数据调整后的数据后续 结语其他以下是废话 试验&#xff0c;本身就是一个摸索的过程&#xff0c;在上一阶段的试验中&#xff0c;我们优化了采集装置&#xff0c;更换了导电性较好的电极。 目前数据美观程度较之前提升了不少&…

ViT:3 Compact Architecture

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-27含并行连结的网络GoogLeNet

27含并行连结的网络GoogLeNet import torch from torch import nn from torch.nn import functional as F import liliPytorch as lp import matplotlib.pyplot as pltclass Inception(nn.Module):# c1--c4是每条路径的输出通道数def __init__(self, in_channels, c1, c2, c3, …

【kaggle数据集无法下载解决办法】

kaggle数据集无法下载的解决办法 当我们在做机器学习相关问题的时候&#xff0c;需要到kaggle网站上下载数据集&#xff0c;但是很多时候速度很慢或者连接超时等问题&#xff0c;此时解决办法如下&#xff1a; 在本地安装Kaggle API包 打开终端输入如下指令&#xff1a; pip i…

vscode使用内置插件断点调试vue2项目

1、首先项目中要开启source-map 在vue.config.js 文件中 module.exports {configureWebpack: {devtool: process.env.NODE_ENV ! "production" ? "source-map" : ,} }2、项目根目录新建.vscode/launch.js文件 {"configurations": [{"ty…

解析JavaScript中逻辑运算符和||的返回值机制

本文主要内容&#xff1a;了解逻辑运算符 &&&#xff08;逻辑与&#xff09;和 ||&#xff08;逻辑或&#xff09;的返回值。 在JavaScript中&#xff0c;逻辑运算符 &&&#xff08;逻辑与&#xff09;和 ||&#xff08;逻辑或&#xff09;的返回值可能并不总…

浏览器提升编译速度小技巧(一)- 防病毒排除

1.引言 在Chrome开发过程中&#xff0c;编译速度是影响开发效率的关键因素之一。编译一个大型项目如Chrome&#xff0c;往往需要处理大量的代码文件和依赖库&#xff0c;这个过程既复杂又耗时。因此&#xff0c;任何能够提升编译速度的技巧&#xff0c;都能显著提高开发效率&a…

Dubbo本地调试解决方案

有三种方式:原文链接 本文尝试使用了原作者推荐的第二种方式&#xff0c;在启动本地的服务时加入全局版本号的参数 -Ddubbo.service.versiontest同时需要修改消费者侧API的版本号。 DubboReference(version "test")private IContentPortraitService contentPortra…

Python-题库篇-基础

文章目录 Python-题库篇-基础题目001: 在Python中如何实现单例模式。题目002&#xff1a;不使用中间变量&#xff0c;交换两个变量a和b的值。题目003&#xff1a;写一个删除列表中重复元素的函数&#xff0c;要求去重后元素相对位置保持不变。题目004&#xff1a;假设你使用的是…

CentOS7.6安装RabbitMQ

前言&#xff1a;因为RabbitMQ是ERlang语言编写所以要先安装ERlang再安装RabbitMQ 安装ERlang 借鉴前辈原文地址&#xff1a;https://www.cnblogs.com/fengyumeng/p/11133924.html 第一步&#xff1a;安装依赖 yum -y install gcc glibc-devel make ncurses-devel open…

快速上手 Spring Boot:基础使用详解

快速上手 Spring Boot&#xff1a;基础使用详解 文章目录 快速上手 Spring Boot&#xff1a;基础使用详解1、什么是SpringBoot2、Springboot快速入门搭建3、SpringBoot起步依赖4、SpringBoot自动配置&#xff1a;以tomcat启动为例5、SpringBoot基础配置6、yaml7、多环境开发配置…

使用Ghostscript将PostScript(.ps)文件转换为PDF文件格式

如何使用Ghostscript将PostScript文件转换为PDF文件格式: /* Example of using GS DLL as a ps2pdf converter. */#if defined(_WIN32) && !defined(_Windows) # define _Windows #endif #ifdef _Windows /* add this source to a project with gsdll32.dll, or comp…

顶尖项目经理都在用的SOP

接受任务SOP 了解任务背景了解任务目标&#xff08;包含deadline&#xff09;拆解任务&#xff0c;确认负责人执行方案审批确认跟进执行并定期汇报验收结果&#xff0c;进行反馈相关文档存档&#xff0c;形成闭环 推进任务SOP - PDCA循环 制定计划 Plan。依据目标&#xff0c…

MacBook Pro 忘记root用户密码,重置密码步骤

一、以普通用户名登录系统&#xff0c;并打开terminal终端&#xff0c; 输入&#xff1a;sudo bash sudo bash Password:*****&#xff08;输入当前用户的密码&#xff09; 成功后进入bash-3.2#的命令模式 二、在bash-3.2#命令模式下 输入&#xff1a;sudo passwd root sud…

生信算法8 - HGVS转换与氨基酸字母表

HGVS 概念 HGVS 人类基因组变异协会(Human Genome Variation Society)提出的转录本编号&#xff0c;cDNA 参考序列(以前缀“c.”表示)、氨基酸参考序列(以前缀“p.”表示)。cDNA 中一种碱基被另一种碱基取代&#xff0c;以“>”进行表示&#xff0c;如&#xff1a;c.2186A&…

python数据分析——数据预处理

数据预处理 前言一、查看数据数据表的基本信息查看info&#xff08;&#xff09;示例 查看数据表的大小shape&#xff08;&#xff09;示例 数据格式的查看type()dtype&#xff08;&#xff09;dtypes&#xff08;&#xff09;示例一示例二 查看具体的数据分布describe()示例 二…

算法常见手写代码

1.NMS def py_cpu_nms(dets, thresh):"""Pure Python NMS baseline."""#x1、y1、x2、y2、以及score赋值x1 dets[:, 0]y1 dets[:, 1]x2 dets[:, 2]y2 dets[:, 3]scores dets[:, 4]#每一个检测框的面积areas (x2 - x1 1) * (y2 - y1 1)#按…