Stream流的使用
Stream使用
Stream和集合的差异在于:
- 集合包含当前数据结构中的所有值,是已经计算好的,Stream是按需计算
- 外部迭代和内部迭代:集合的数据是已经计算好的,迭代需要人工在外部代码进行管理,Stream是只需要告诉它你需要什么,它在内部帮你实现好,返回
- 一次性的流:和迭代器类似,只能迭代一次,使用过的流不可以再使用
常用方法
stream()/parallelStream()
//示例
list.stream();//return Stream<E>
/* filter(T->boolean)*/
//保留年龄为 20 的 person 元素
list = list.stream()
.filter(person -> person.getAge() == 20)
.collect(Collectors.toList());
distinct()
去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的
sorted() / sorted((T, T) -> int)
//如果流中的元素的类实现了Comparable的接口,即有自己的排序规则,可直接调用sorted()方法
list = list.stream()
.sorted((p1, p2) -> p1.getAge() - p2.getAge())
.collect(Collectors.toList());
//可简化为
list = list.stream()
.sorted(Comparator.comparingInt(Person::getAge))
.collect(Collectors.toList());
limit(long n)
//返回前n个元素
list = list.stream()
.limit(2)
.collect(Collectors.toList());
skip(long n)
//去除前n个元素
list = list.stream()
.skip(2)
.collect(Collectors.toList());
map(T -> R)
//将流中的每一个元素 T 映射为 R(类似类型转换)
List<String> newlist = list.stream().map(Person::getName).collect(Collectors.toList());
flatMap(T -> Stream)
//将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流。
list = list.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(toList());
anyMatch(T -> boolean)
//流中是否有一个元素匹配给定的 T -> boolean 条件
//是否存在一个 person 对象的 age 等于 20:
boolean b = list.stream().anyMatch(person -> person.getAge() == 20);
allMatch(T -> boolean)
//流中是否所有元素都匹配给定的 T -> boolean 条件
boolean result = list.stream().allMatch(Person::isStudent);
noneMatch(T -> boolean)
//流中是否没有元素匹配给定的 T -> boolean 条件
boolean result = list.stream().noneMatch(Person::isStudent);
findAny() 和 findFirst()
//findAny():找到其中一个元素 (使用 stream() 时找到的是第一个元素;使用 parallelStream()并行时找到的是其中一个元素)
//findFirst():找到第一个元素
count()
//返回流中元素个数,结果为 long 类型。
collect()
//收集方法,常用的是 collect(toList()),还有 collect(toSet()) 等,参数是一个收集器接口。
forEach()
//打印各个元素:
list.stream().forEach(System.out::println);
//向数据库插入新元素:
list.stream().forEach(PersonMapper::insertPerson);
//数值流转换为流
Stream<Integer> stream = intStream.boxed();
//groupingBy 用于将数据分组,最终返回一个 Map 类型
Map<Integer, List<Person>> map = list.stream().collect(groupingBy(Person::getAge));
//多级分组
Map<Integer, Map<T, List<Person>>> map = list.stream().collect(groupingBy(Person::getAge, groupBy(...)));
//partitioningBy 分区
//分区与分组的区别在于,分区是按照 true 和 false 来分的
Map<Boolean, List<Person>> map = list.stream()
.collect(partitioningBy(p -> p.getAge() <= 20));
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~