这篇文章只有一些比较初级的用法,以后会有补充。
jdk8中除了lambda,还有一个非常非常nb的新特性--Stream,ta实现了函数式数据处理,极大的提高了代码代码效率及并发效率,lambda只是是stream的基础
lambda:https://www.cnblogs.com/bfe0-ceb6/p/15344180.html
Optional: https://www.cnblogs.com/bfe0-ceb6/p/15352174.html
Stream概念: 用于做函数式数据处理(可以理解为现成的具特定功能的函数对数据进行处理),常用于处理集合中的数据
**流的操作
数据源
中间操作链: 每一个中间操作都会返回一个流,此时为惰性求值,不进行任何计算,只是定义了流的执行规则,并不会执行(提高效率)
终端操作:执行中间操作的所有构建,返回结果
Stream 中间操作
方法 | 返回值 | 参数类型 | 参数方法描述 | 含义 |
---|---|---|---|---|
filter | Stream<T> | Predicate | T->boolean | 筛选元素 |
distinct | Stream<T> | 无参 | 过滤重复元素 | |
limit | Stream<T> | long | 截短流 | |
map | Stream<R> | Function | T->R | 映射流 |
flatMap | Stream<R> | Function | T->Stream<R> | 扁平化 |
sorted | Stream<T> | Comparator | 排序 |
Stream 终端操作
方法 | 返回值 | 参数类型 | 参数方法描述 | 含义 |
---|---|---|---|---|
anyMatch | boolean | Predicate | T->boolean | 任意匹配 |
noneMatch | boolean | Predicate | T->boolean | 全不匹配 |
allMatch | boolean | Predicate | T->boolean | 全匹配 |
findAny | Optional<T> | 无参 | 查找任一元素 | |
findFirst | Optional<T> | 无参 | 查找首元素 | |
forEach | 无返回值 | Consumer | T->void |
在Stream终端操作可以放入收集器Collector, Collectors工具类内置了很多Collector
Collectors
方法 | 返回值R类型 | 参数类型 | 参数方法描述 | 含义 |
---|---|---|---|---|
toList | List<T> | 无参 | 转为List | |
counting | Long | 无参 | 统计元素个数 | |
summingInt | Integer | ToIntFunction | T->int | Int总和 |
averagingInt | Double | ToIntFunction | T->int | Int平均数 |
maxBy | Optional<T> | Comparator | (T,T)->int | 最大值 |
joining | String | 无参 |
现有一个list 集合 里面储存 R 对象
@Data
@AllArgsConstructor
public class R {
private String id;
private String type;
private String name;
private String gender;
private Map<String,String> skill;
public static List<R> getR(){
R r1 = new R("1", "fs", "Teemo", "男", ImmutableMap.of("p", "隐形的翅膀", "q", "致盲吹箭", "w", "小莫快跑", "e", "毒性射击", "r", "种蘑菇"));
R r2 = new R("2", "zs", "Jax", "男", ImmutableMap.of("p", "", "q", "", "w", "", "e", "八档电风扇", "r", ""));
R r3 = new R("3", "zs", "Yasuo", "男", ImmutableMap.of("p", "", "q", "", "w", "", "e", "", "r", ""));
R r4 = new R("4", "fs", "Anne", "女", ImmutableMap.of("p", "", "q", "", "w", "", "e", "", "r", "提伯斯之怒"));
R r5 = new R("5", "ck", "Zed", "男", ImmutableMap.of("p", "", "q", "手里干", "w", "", "e", "", "r", ""));
return Arrays.asList(r1, r2, r3, r4, r5);
}
}
代码
public static void main(String[] args) {
List<R> rList = R.getR();
//遍历
rList.forEach(System.out::println);
//获取所有type 为zs的 R
List<R> _zs = rList.stream().filter(r -> ("zs").equals(r.getType())).collect(Collectors.toList());
//根据type分组 放入到map
Map<String, List<R>> _type = rList.stream().collect(Collectors.groupingBy(R::getType));
//获取rList中R的name,返回name集合
List<String> _name = rList.stream().map(r -> r.getName()).collect(Collectors.toList());
//判断 fs 个数
long count = rList.stream().filter(r -> "fs".equals(r.getType())).count();
}
关于Stream的用法,后面还会有补充
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具