java的Stream流学习
java的Stream流(学习视频观后感)
stream流的相关知识点分为以下五种:创建流、中间操作,聚合操作,转换容器操作,顺序流/并行流切换
1. 创建流
创建流可以通过以下几种方式
list.stream(); //通过列表List转为stream
Stream.of(a,b,c...);//通过Stream.of静态方法
//还有其他与文件有关的文件流操作
2. 中间操作
filter // 按照表达式过滤
map //映射,通常用于将对象某种成员变量提取出来
sorted // 对流中元素进行排序,元素要实现比较接口,或者直接写一个比较器作为参数
distinct //对象要重写equals方法,基本类型不用
concat // 合并两个流
limit //限制从流中获取前n个元素
skip //跳过前n个元素
3. 聚合操作
//min,max,sum,count,average 这一类不用多说
//reduce 特殊的操作,可以自定义规则来对流操作,如将字符串用逗号相连
String result = persons.stream()
.map(Person::getName)
.reduce("", (a, b) -> a + b + ",");//第一个参数为初始值,后面规则
此外还有些操作,是短路操作,一旦符合条件,就结束处理,无需处理整个流
有效短路操作:找到符合条件的元素时结束处理,而不会处理整个流
anymatch
noneMatch 没有一个符合条件
allMatch 所有元素都符合条件
findFirst 返回第一个元素(返回类型为Optional,因为不确定是否为Null)
findAny 返回 任意一个元素(同上)
4. 转换容器操作
转换容器方法为 collect(Collector) ,Collector本身提供很多静态转换容器方法,如toList(),toMap()等。
List<Integer> ageList = persons.stream().map(Person::getAge).collect(Collectors.toList());
自定义Collector
ArrayList<String> collect = Stream.of("A", "C", "B", "D", "E", "F")
.map(String::toLowerCase)
.collect(Collector.of(
//Supplier
() -> {//定义容器类型
return new ArrayList<>();
},
//Accumulator 累加器
(list, item) -> {
list.add(item);
},
//combiner 用于并行流相邻两个数据段的合并
(left, right) ->
{
left.addAll(right);
return left;
}
// Collector.Characteristics.IDENTITY_FINISH //默认策略,将累加器结果作为最终结果
// Collector.Characteristics.UNORDERED //设置无序
// Collector.Characteristics.CONCURRENT
));
collect.forEach(System.out::println);
再来说一下Collector的三种配置:IDENTITY_FINISH,UNORDERED,CONCURRENT
IDENTITY_FINISH 是默认策略,将累加器结果作为最终结果
UNORDERED ,这里无序并不是指输出结果无序,而是不按流中元素输入的顺序执行。
CONCURRENT。默认情况下,在并行流中,流的每个分段处理结果都交给一个临时容器,处理结束后将各个临时容器的结果合并;而当配置CONCURRENT属性,则所有分段共享一个容器。需要注意,如果容器不是线程安全的,就会忽略这条属性。
5.顺序流/并行流
Stream操作默认顺序流,使用并行流需要加.parallel(),标志后面的操作都用并行流处理。并行流的工作机制是将流分为多个段,每个段交给一个线程负责,然后通过合并策略(也就是上面combiner)进行合并。
ArrayList<String> collect = Stream.of("A", "C", "B", "D", "E", "F")
.parallel() //开并行流
.map(String::toLowerCase)
.collect(Collector.of(
//Supplier
() -> {//定义容器类型
return new ArrayList<>();
},
//Accumulator 累加器
(list, item) -> {
list.add(item);
},
//combiner 用于并行流相邻两个数据段的合并
(left, right) ->
{
left.addAll(right);
return left;
}
// Collector.Characteristics.IDENTITY_FINISH //默认策略,将累加器结果作为最终结果
// Collector.Characteristics.UNORDERED //设置无序
// Collector.Characteristics.CONCURRENT
));
collect.forEach(System.out::println);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!