记一下 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,一经查实,立即删除!

相关文章

single_cell_tutorial 教程

介绍 1、AnnData 不是一个单一的表格,而是一个包含多个表格和矩阵的复杂数据结构,用于处理和存储单细胞基因组数据。 AnnData对象包含以下主要部分: var:基因的元数据(Pandas DataFrame格式),包含每个基因的属性信息。例如每个基因的ID、名称、染色体位置等。可以将其…

软件工程-第4章结构化编码和测试

软件的实现阶段&#xff1a;软件编码&#xff0c;单元测试和综合测试。 软件编码是对软件设计的进一步具体化&#xff0c;其任务是将设计表示变换成用程序设计语言编写的程序。 软件测试是软件质量保证的重要手段&#xff0c;要成功开发出高质量的软件产品&#xff0c;必须认…

如何使用 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;的返回值可能并不总…

GPT-5 一年半后发布?迎接AI技术变革

人工智能的快速发展正在深刻改变我们的世界。作为AI技术的前沿代表&#xff0c;OpenAI的GPT系列一直备受关注。最新消息显示&#xff0c;GPT-5将于一年半后发布&#xff0c;并被期望达到“博士级”的智能水平。GPT-5的到来不仅预示着AI在技术上的飞跃&#xff0c;也意味着它将在…

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

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

Dubbo本地调试解决方案

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

TypeError: Cannot set properties of null (setting ‘innerText‘)?

TypeError: Cannot set properties of null (setting innerText) 解释&#xff1a; 这个错误表明你尝试给一个null值的对象设置innerText属性。在JavaScript中&#xff0c;null表示一个空值或者“没有对象”&#xff0c;因此不能对其进行属性设置操作。 解决方法&#xff1a…

微信小程序的媒体组件

微信小程序中的媒体组件主要包括音频组件 和视频组件 &#xff0c;它们可以帮助开发者在小程序中嵌入和播放多媒体内容。以下是对这两个组件的详细介绍&#xff1a; 音频组件 组件用于在小程序中播放音频文件。它支持多种配置选项和事件处理。 属性 src: 音频资源的 URL 地址。…

Python-题库篇-基础

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

排序题目:丢失的数字

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 解法四思路和算法代码复杂度分析 解法五预备知识思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;丢失…

osg::Stats类用法及该类源码剖析

1. 概述 Stats是英文单词statistics的简写。顾名思义&#xff0c;就知道osg::Stats是osg中用来统计某些信息的类&#xff0c;如&#xff1a;帧率等&#xff0c;在osg中很多地方用到该类统计某些信息&#xff0c;如下代码是摘自osg的Viewer::eventTraversal()函数&#xff0c;该…

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…