常用Stream流

news/2025/1/6 6:15:46/

Stream流

数据源
数据处理
数据结果
filter 过滤
limit 取前几
sorted 排序
max、min、count
map 对集合中的元素进行特定的操作
reduce 将所有的元素按照传入的逻辑进行处理,并且会把结果合并成一个值进行返回
collection 基于目标集合生成新的数组

public class Test {public static void main(String[] args) {List<User> list = Arrays.asList(new User("小明", 20, 3000),new User("小红", 20, 2000),new User("小亮", 22, 5000));// stream 流Predicate<User> predicate1 = user -> user.getAge() < 21;Predicate<User> predicate2 = user -> user.getAge() < 2000;List<User> collect = list.stream().filter(predicate1.or(predicate2)).collect(Collectors.toList());System.out.println(collect);// filter 过滤List<String> testList = Arrays.asList("Hello", "World", "Java");testList.stream().filter(str -> str.length() >= 5).forEach(str -> System.out.println(str));// limittestList.stream().limit(2).forEach(str -> System.out.println(str));// sorted 排序List<Integer> integerList = Arrays.asList(1, 6, 5, 4, 2, 3);integerList.stream().sorted()//正序.sorted(Comparator.reverseOrder())//反序.forEach(num -> System.out.println(num));// max、min、countSystem.out.println("最大的数:" + integerList.stream().max(Integer::compareTo).get());System.out.println("最小的数:" + integerList.stream().min(Integer::compareTo).get());System.out.println("集合长度:" + integerList.stream().count());// map 对集合中的元素进行特定的操作integerList.stream().map(num -> num + 10).forEach(num -> System.out.println(num));// reduce 将所有的元素按照传入的逻辑进行处理,并且会把结果合并成一个值进行返回System.out.println("集合中的元素求和为:" + integerList.stream().reduce((sum, num) -> sum + num).get());// collection 基于目标集合生成新的数组List<Integer> collectList = integerList.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());System.out.println("偶数集合:" + collectList);}
}

使用Stream流对集合进行分页

// 通过流处理进行分页
List<String> subList = denyList.stream().skip((pageNo-1)*pageSize) // 跳过(第pageNo页-1)*每页多少条 例如:第一页就是跳过0条,第二页跳过1*每页的条数....limit(pageSize)// 取pageSize条数据.collect(Collectors.toList());// 将过滤的数据输出成集合

对集合中实体中某个字段进行去重

// 使用
List<TopicReplyRecord> filterDistinctList = notUserNameCommentsList.stream().filter(distinctByKey(TopicReplyRecord::getReply_record_id)).collect(Collectors.toList());private static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}

Stream流性能分析

1、性能分析
在少数据量的处理场景中(size <= 1000)
stream 的处理效率是不如传统的 iterator 外部迭代器处理速度快的,但是实际上这些处理任务本身运行时间都低于毫秒,这点效率的差距对普通业务几乎没有影响,反而 stream 可以使得代码更加简洁;

在大量数据(size > 10000)
stream 的处理效率会高于 iterator,特别是使用了并行流,在 cpu 恰好将线程分配到多个核心的条件下(当然 parallel stream 底层使用的是 JVM 的 ForkJoinPool,这东西分配线程本身就很玄学),可以达到一个很高的运行效率,然而实际普通业务一般不会有需要迭代高于 10000 次的计算;

Parallel Stream (并行流)
Parallel Stream 受引 CPU 环境影响很大,当没分配到多个 cpu 核心时,加上引用 forkJoinPool 的开销,运行效率可能还不如普通的 Stream;

2、使用建议
简单的迭代逻辑,可以直接使用 iterator,对于有多步处理的迭代逻辑,可以使用 stream,损失一点几乎没有的效率,换来代码的高可读性是值得的;

单核 cpu 环境,不推荐使用 parallel stream,在多核 cpu 且有大数据量的条件下,推荐使用 paralle stream;
stream 中含有装箱类型,在进行中间操作之前,最好转成对应的数值流,减少由于频繁的拆箱、装箱造成的性能损失。


http://www.ppmy.cn/news/8302.html

相关文章

04 业务服务注册到 nacos 默认权重为0, 导致 gateway 获取不到业务服务

前言 最近搭建 xxx服务 的时候碰到了一个这样的问题 某业务服务 启动之后, 注册到 nacos, 然后 从 gateway 来获取该服务却报错, 没有找到 xxx服务 之前 记录了一个 todo, 今天 来梳理一下 主要是会涉及到我们关注的问题, 以及 服务的注册流程 不会大而全 nacos 服务实…

mysql基础笔记3

连接查询 &#xff08;1&#xff09;内连接 找同一个字段 select 表1字段1,。。。。表2 字段...... from 表1&#xff0c;表2 where 条件 表1.字段表2.字段 &#xff08;2&#xff09;外连接 &#xff08;1&#xff09;左外连接 左表中的所有数组 select section,logi…

设置 MYSQL 数据库编码为 utf8mb4

utf-8编码可能2个字节、3个字节、4个字节的字符&#xff0c;但是MySQL的utf8编码只支持3字节的数据&#xff0c;而移动端的表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据&#xff0c;java程序中将报SQL异常&#xff1a; java.sql.SQLException: Inc…

canopen10.0_基于STM32F407实现CANopen通讯

1.通过使用STM32F407开发板,实现CANopen通讯控制英威腾电机。之前没有接触过CANopen,这篇文章记录一下移植CANopen中所参考的一些参考资料,以帮助小白快速了解并实现CANopen移植 2.CANopen入门: 1.1、 在进行移植时,需要对CAN及CANopen进行了解,本人所使用的是正点原子…

HCIA静态试验(12.30-31复习)

目标实现&#xff1a; 2、首先进行子网划分 基于192.168.1.0 24划分 ‘一共7个路由器需要7个网段还有7个主干网 192.168.1.0/24 ----用于骨干 192.168.1.32/27 ----R1环回 192.168.1.32/28 192.168.1.48/28 192.168.1.64/27 --- R2环回 192.168.1.64/28 192.168.1.80/28 …

【C++】STL —— 用哈希表同时封装出unordered_set和unordered_map

目录 一、底层结构 1. 哈希的概念 二、哈希冲突 三、哈希函数 四、解决哈希冲突 1. 闭散列&#xff08;开放定址法&#xff09; 1. 线性探测 2. 二次探测 2. 闭散列的实现 3. 开散列&#xff08;拉链法&#xff09; 4. 开散列和闭散列的比较 五、HashTable的…

最大似然和贝叶斯参数估计

统计生成模型的参数估计 – Maximum Likelihood(ML) 假设参数是某个确定的值&#xff0c;通过使似然度最大求出参数 – Bayesian estimation 假设参数是随机变量&#xff0c;估计参数分布的参数 – 最大似然求出具体的参数&#xff0c;贝叶斯求的是参数的分布 最大似然估计 假…

数据结构进阶 二叉树OJ题二

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍几道二叉树的oj题 题目一 二叉搜索树与双向链表 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表…