Java 集合框架大师课:集合流式编程革命(三)

devtools/2025/2/28 14:40:58/

🚀 Java 集合框架大师课:集合流式编程革命(三)

🔥 系列成就:集合框架战力值突破 90%!建议边撸代码边循环《孤勇者》进入心流状态 🎧


第一章:流式编程总动员

1.1 现实中的流水线哲学

想象奶茶店制作流程🥤:

原料 → 煮茶 → 加料 → 封口 → 交付

Java Stream 就是代码世界的流水线工程师👷,三大特征:

  • 不修改源数据(新建流水线不破坏原料)
  • 懒加载机制(不到最后不生产)
  • 可多线并行(开多个窗口加速)

第二章:流式入门四重奏

2.1 流创建的四种姿势

java">// 姿势一:集合转流 🌀
List<String> cities = Arrays.asList("北京", "上海", "广州");
Stream<String> cityStream = cities.stream();// 姿势二:数组转流 📦
String[] arr = {"A","B","C"};
Stream<String> arrStream = Arrays.stream(arr);// 姿势三:直接生成 🎰
Stream<Integer> numStream = Stream.of(1,2,3);// 姿势四:无限流 ♾️
Stream.generate(() -> Math.random()).limit(5).forEach(System.out::println);

2.2 流操作分类表

操作类型特点常见方法
中间操作延迟执行filter(), map(), distinct()
终端操作触发流水线启动forEach(), collect(), count()
短路操作优化执行效率findFirst(), limit()

第三章:流式操作实战营

3.1 过滤大师课

java">List<String> names = Arrays.asList("张三","李四","张无忌","王五");// 案例一:筛选张家人
List<String> zhangList = names.stream().filter(name -> name.startsWith("张")).collect(Collectors.toList());
// 🎯 结果:["张三","张无忌"]// 案例二:去重+长度过滤
List<String> uniqueList = names.stream().distinct().filter(name -> name.length()>2).collect(Collectors.toList());

3.2 映射变形记

在这里插入图片描述

java">// 字符串转大写+获取长度
List<String> upperList = names.stream().map(String::toUpperCase).collect(Collectors.toList());List<Integer> lengthList = names.stream().map(String::length).collect(Collectors.toList());

第四章:高阶流式魔法

4.1 扁平化降维打击

java">// 二维数组扁平化
List<List<Integer>> matrix = Arrays.asList(Arrays.asList(1,2),Arrays.asList(3,4)
);List<Integer> flatList = matrix.stream().flatMap(List::stream).collect(Collectors.toList());
// 🧮 结果:[1,2,3,4]

4.2 分组终极奥义

java">// 学生成绩分组
class Student {String name;int score;// 构造方法省略
}List<Student> students = Arrays.asList(new Student("张三",85),new Student("李四",92),new Student("王五",85)
);Map<Integer, List<Student>> scoreGroup = students.stream().collect(Collectors.groupingBy(s -> s.score/10*10));
// 📊 结果:{80:[张三,王五], 90:[李四]}

第五章:并行流性能革命

5.1 并行流 VS 顺序流

java">Long start = System.currentTimeMillis();
IntStream.range(0,1000000).parallel()  // 魔法开关✨.filter(n -> n%2==0).count();
System.out.println("耗时:"+(System.currentTimeMillis()-start)+"ms");

5.2 并行流工作原理

在这里插入图片描述


第六章:流式编程避坑指南

6.1 常见错误 TOP3

java">// 错误一:重复使用流
Stream<String> stream = names.stream();
stream.forEach(System.out::println);
stream.filter(s -> s.length()>3); // ⚠️ 抛出IllegalStateException// 错误二:修改外部变量
int[] sum = {0};
names.stream().forEach(s -> sum[0] += s.length()); // ❌ 非线程安全// 错误三:无限流忘加限制
Stream.generate(() -> "Hi").forEach(System.out::println); // 死循环💥

6.2 调试技巧宝典

java">// 技巧一:peek() 调试
List<String> result = names.stream().peek(s -> System.out.println("过滤前:"+s)).filter(s -> s.length()>2).peek(s -> System.out.println("过滤后:"+s)).collect(Collectors.toList());// 技巧二:异常处理
List<Integer> nums = Arrays.asList("1","2","x").stream().map(s -> {try {return Integer.parseInt(s);} catch (Exception e) {System.out.println("格式错误:"+s);return null;}}).filter(Objects::nonNull).collect(Collectors.toList());

第七章:流式编程性能天梯

场景传统方式顺序流并行流推荐方案
小型数据集遍历⭐⭐⭐⭐⭐⭐⭐传统循环
复杂数据处理⭐⭐⭐⭐⭐⭐⭐⭐⭐顺序流
大型数据集计算⭐⭐⭐⭐⭐⭐⭐并行流
IO密集型操作⚠️不建议用

第八章:流式编程终极实战

电商订单分析

java">// 模拟订单数据
class Order {Long orderId;Double amount;String province;// 构造方法省略
}List<Order> orders = Arrays.asList(new Order(1001L, 158.0, "广东"),new Order(1002L, 299.0, "浙江"),new Order(1003L, 3588.0, "广东")
);// 需求一:各省销售总额
Map<String, Double> provinceSales = orders.stream().collect(Collectors.groupingBy(o -> o.province,Collectors.summingDouble(o -> o.amount)));// 需求二:TOP3 订单
List<Order> top3 = orders.stream().sorted((o1,o2) -> Double.compare(o2.amount, o1.amount)).limit(3).collect(Collectors.toList());

🚨 祖师爷的终极忠告

  1. 不要为了用流而用流

    java">// 传统方式更直观的场景
    for(int i=0; i<10; i++){System.out.println("简单循环用流是耍流氓!");
    }
    
  2. 警惕并行流的副作用

    java">// 线程不安全的累加操作
    List<Integer> unsafeList = new ArrayList<>();
    IntStream.range(0,1000).parallel().forEach(unsafeList::add); // 必定翻车!💥
    

🌠 第九章:流式编程的隐藏关卡

9.1 流的生命周期全解密

在这里插入图片描述

就像煮泡面🍜的流程:

  1. 拆包装(创建流)
  2. 加调料(中间操作)
  3. 等水开(延迟执行)
  4. 开吃!(终端操作)

9.2 短路操作的妙用

java">List<String> magicWords = Arrays.asList("Abracadabra", "Alohomora", "Expelliarmus");// 找第一个长度超过10的咒语
Optional<String> longWord = magicWords.stream().filter(s -> s.length() > 10).findFirst();// 用 orElseGet 保底                            
System.out.println(longWord.orElseGet(() -> "Lumos✨")); 
⚡ 短路操作三剑客
招式名称触发条件使用场景
findFirst()找到第一个符合元素快速检索 🕵️♂️
anyMatch()任意元素满足条件存在性检查 ✅
limit()限制元素数量数据采样 🔍

🍜 第十章:流式编程的厨房秘籍

10.1 数据烹饪的终极配方

java">// 菜谱:制作水果沙拉 🥗
List<String> fruits = Arrays.asList("🍎", "🍌", "🍇", "🍊", "🍓");String salad = fruits.stream().filter(f -> !f.contains("🍌")) // 香蕉过敏者慎用.sorted(Comparator.comparingInt(String::length)) .map(f -> "切好的" + f) .collect(Collectors.joining(" + "));System.out.println(salad); 
// 输出:切好的🍎 + 切好的🍇 + 切好的🍊 + 切好的🍓

10.2 黑暗料理预警 🚨

java">// 错误案例:在流中修改源数据
List<String> foodList = new ArrayList<>(Arrays.asList("🍔", "🍟", "🥤"));
foodList.stream().map(f -> {foodList.add("🍦"); // 偷偷加餐return f + "套餐";}).forEach(System.out::println); 
// 引发 ConcurrentModificationException 💥

🕹️ 第十一章:流式游戏厅

11.1 数据俄罗斯方块

java">// 消除所有偶数块
List<Integer> blocks = Arrays.asList(1,2,3,4,5,6);
List<Integer> newBlocks = blocks.stream().filter(n -> n%2 != 0).collect(Collectors.toList());
// 🎮 结果:[1,3,5]

11.2 流式贪吃蛇

在这里插入图片描述

java">// 模拟蛇的移动轨迹
List<Point> snakePath = Stream.iterate(new Point(0,0), p -> new Point(p.x+1, p.y+(int)(Math.random()*3)-1)).limit(10).collect(Collectors.toList());

🧪 第十二章:流式实验室

12.1 自定义收集器

java">// 实现字符串拼接收集器
Collector<String, StringBuilder, String> myCollector = Collector.of(StringBuilder::new,          // 容器工厂(sb, s) -> sb.append(s).append("🐶"),  // 累加器(sb1, sb2) -> sb1.append(sb2),       // 合并器StringBuilder::toString      // 最终转换);String result = Stream.of("柴犬", "柯基", "哈士奇").collect(myCollector);
// 🐾 输出:柴犬🐶柯基🐶哈士奇🐶

12.2 流与 Optional 的化学反应

java">// 找出最贵的商品(可能不存在)
Optional<Product> mostExpensive = productList.stream().max(Comparator.comparing(Product::getPrice));// 优雅处理空值
mostExpensive.ifPresentOrElse(p -> System.out.println("剁手吧!💸 " + p.getName()),() -> System.out.println("购物车空空如也~ 🛒")
);

🏎️ 第十三章:流式性能调优

13.1 并行流的最佳拍档

java">// 使用线程安全的容器加速
List<Integer> safeList = new CopyOnWriteArrayList<>();
IntStream.range(0,10000).parallel().forEach(safeList::add); // 安全操作 ✅

13.2 流式操作的缓存策略

在这里插入图片描述

java">// 错误示范:重复使用基础流
Supplier<Stream<String>> streamSupplier = () -> list.stream();// 正确用法 ✅
streamSupplier.get().filter(...);
streamSupplier.get().map(...);

🎩 第十四章:流式魔术表演

14.1 数据消失魔术

java">List<Integer> numbers = Arrays.asList(1,2,3,4,5,6);// 让所有偶数消失!
List<Integer> magicResult = numbers.stream().filter(n -> {System.out.println("见证奇迹的时刻!✨");return n % 2 != 0;}).collect(Collectors.toList());

14.2 无限流的时间魔法

java">// 生成斐波那契数列
Stream.iterate(new long[]{0, 1}, pair -> new long[]{pair[1], pair[0] + pair[1]}).map(pair -> pair[0]).limit(10).forEach(n -> System.out.print(n + "➔ "));
// 🔮 输出:0➔ 1➔ 1➔ 2➔ 3➔ 5➔ 8➔ 13➔ 21➔ 34➔ 

🧭 第十五章:流式导航图鉴

15.1 流式 API 全家福

在这里插入图片描述

15.2 流式选择决策树

是否处理集合数据? → 是 → 是否需要链式操作? → 是 → 使用流式编程↓否 → 传统循环↓否 → 选用其他方案

🚀 终极奥义:流式心法口诀

📜《九阳神功·流式篇》  
一流创建需牢记  
二链操作分中间  
三诀终端定生死  
四防副作用捣乱  
五用并行加速器  
六避状态共享险  
七善短路省资源  
八选合适场景用  
九层境界自然成  

🎮 课后挑战赛

挑战一:用户行为分析

java">// 给定用户访问日志,请计算:
// 1. 最活跃的TOP3用户
// 2. 不同时段的访问量分布
// 3. 平均访问时长
class UserLog {String userId;LocalDateTime time;int duration; // 分钟
}

挑战二:流式生成迷宫

在这里插入图片描述


🎉 下集预告:集合框架性能调优秘籍

java">// 剧透代码:JMH 性能测试
@Benchmark
public void testStream(Blackhole bh) {bh.consume(list.stream().filter(x -> x%2==0).count());
}

🌟 终极心法:流式编程就像乐高积木,用简单的操作组合出无限可能!当你掌握数据流动的艺术,就能在代码世界里召唤神龙! 🐉✨


http://www.ppmy.cn/devtools/163376.html

相关文章

AI 与光学的融合:开启科技变革新征程

在当今科技发展的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;与光学这两个看似独立的领域&#xff0c;正逐渐紧密交织&#xff0c;开启了一场影响深远的科技变革。AI 技术凭借强大的数据分析、模式识别和智能决策能力&#xff0c;与光学在信息传输、成像、传感等方面…

网页制作10-html,css,javascript初认识の适用XHTML

一、简介&#xff1a; Xhtml是extensible hypertext markup language的缩写。它是由国际W3C组织制定并公布发行的。是一个过渡技术&#xff0c;结合了部分xml的强大功能及大多数html的简单特性。 Advantage. Xhtml提倡更简洁规范的代码。 Xhtml.文档在旧的基于的浏览器中&…

k8s集群部署

集群结构 角色IPmaster192.168.35.135node1192.168.35.136node2192.168.35.137 部署 #需在三台主机上操作 //关闭防火墙 [rootmaster ~]# systemctl disable --now firewalld//关闭selinux [rootmaster ~]# sed -i s/enforcing/disabled/ /etc/selinux/config//关闭swap分区…

【数据结构】(11) Map 和 Set

一、Map 和 Set 的简介 1、Set 和 Map Map 和 Set 是集合类框架学习的最后一部分。Map 和 Set 都是接口&#xff0c;需要通过 TreeSet、HashSet 和 TreeMap、HashMap 实例化。注意&#xff0c;Set 实现了 Collection&#xff0c;Map 并没有。 Set 存放的是键&#xff08;Key&a…

【Python修仙编程】(二) Python3灵源初探(3)

第一部分&#xff1a;乾坤袋的秘密与修炼之路 在修仙界&#xff0c;有一个古老的传承&#xff0c;名为《Python无极心法》&#xff0c;它蕴含着强大的力量&#xff0c;能够助修仙者突破重重境界&#xff0c;领悟宇宙天地的奥秘。而要修炼此心法&#xff0c;必须先从基础的“乾…

【前端基础】Day 1 HTML

总结&#xff1a; 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

【蓝桥杯嵌入式】各模块学习总结

系列文章目录 留空 文章目录 系列文章目录前言一、LED模块1.1 赛题要求1.2 模块原理图1.3 编写代码1.4 赛题实战 二、LCD模块2.1 赛题要求2.2 模块原理图2.3 编写代码2.4 赛题实战 三、按键模块3.1 赛题要求3.2 模块原理图3.3 编写代码3.4 赛题实战 四、串口模块4.1 赛题要求4…

2004-2024年光刻机系统及性能研究领域国内外发展历史、差距、研究难点热点、进展突破及下一个十年研究热点方向2025.2.27

一.光刻机概述 1.1 定义与原理 光刻机是 集成电路芯片制造的核心设备 ,其工作原理基于 光学成像和化学反应 。它通过 曝光系统 将掩模版上的图形精确地转移到涂覆于硅片表面的光刻胶上。这个过程涉及复杂的物理和化学反应,主要包括以下几个步骤: 涂胶 :在硅片表面均匀涂抹…