试学包概述
本试学包基于《6-8周Java工程师成长大纲》第一周内容设计,旨在让你体验后续每日学习的"四维结合"模式:
- 视频输入:观看优质教程,建立直观认知
- 文档阅读:理解核心概念与原理
- 编码实战:通过练习内化知识点
- 图文总结:梳理知识体系,沉淀学习成果
本次试学聚焦Java 8两大核心特性:Lambda表达式与Stream API,这是现代Java开发的基础,也是后续学习Spring生态的前提。
一、视频推荐清单(B站优质免费课程)
1. 尚硅谷《Java8新特性》完整教程
- 主讲老师:李贺飞
- 课程特点:从零开始,循序渐进,涵盖Lambda、Stream、Optional、新时间API等全部新特性
- 时长:约10小时(分集学习,建议先看前4小时)
- B站链接 :https://www.bilibili.com/video/BV14W411u7Ly?p=1
- 推荐理由:机构权威,讲解系统,案例丰富,适合零基础入门
2. 黑马程序员《Java函数式编程全套视频教程》
- 主讲老师:满一航
- 课程特点:专攻函数式编程,深度讲解Lambda与Stream应用场景
- 时长:16小时
- B站链接 :https://www.bilibili.com/video/BV1Gh41187uR
- 推荐理由:实战导向,代码量大,适合动手能力强的学习者
3. 三更草堂《Java8函数式编程从入门到精通》
- 主讲老师:三更草堂
- 课程特点:通俗易懂,思路清晰,重点突出核心概念
- 时长:5小时
- B站链接 :https://www.bilibili.com/video/BV1sv411y7m5
- 推荐理由:UP主视角,更贴近学习者思维,讲解亲和力强
4. 尚硅谷宋红康《Java零基础入门教程》Java8新特性部分
- 主讲老师:宋红康
- 课程特点:Java基础+新特性融合教学,理解更连贯
- 时长:第18章约4小时
- B站链接 :https://www.bilibili.com/video/BV1PY411e7J6?p=194
- 推荐理由:784万播放量验证,经典入门教程
学习建议:
- 先观看尚硅谷李贺飞老师课程前2小时,建立整体认知
- 结合三更草堂教程补充理解难点
- 后续学习时参考黑马程序员的实战案例
二、文档摘要:核心概念速览
Lambda表达式
本质:匿名函数,简化函数式接口的实现
核心语法:
(参数列表) -> { 代码块 }
省略规则:
- 参数类型可省略(编译器自动推断)
- 单参数可省略括号:
s -> System.out.println(s) - 单行代码可省略大括号和return:
(a, b) -> a + b
函数式接口:
- 定义:只有一个抽象方法的接口
- 注解:
@FunctionalInterface(编译校验) - 常用内置接口:
Consumer<T>:消费型,void accept(T t)Supplier<T>:供给型,T get()Function<T, R>:函数型,R apply(T t)Predicate<T>:断言型,boolean test(T t)
使用场景:
- 集合遍历:
list.forEach(s -> System.out.println(s)) - 线程创建:
new Thread(() -> System.out.println("执行")) - Stream流操作:
filter()、map()等方法的参数
Stream API
本质:数据处理的流水线,非存储结构
三大阶段:
- 创建流 :
list.stream()、Stream.of()、Arrays.stream() - 中间操作 :链式调用,惰性执行
filter(Predicate):过滤map(Function):转换sorted():排序distinct():去重limit(n):限制数量skip(n):跳过元素
- 终止操作 :触发计算,关闭流
collect(Collectors.toList()):收集为列表forEach(Consumer):遍历消费count():计数findFirst():查找第一个
核心特性:
- 不修改源数据(生成新流)
- 惰性求值(无终止操作不执行)
- 内部迭代(自动遍历,无需手动循环)
- 支持并行(
parallelStream()一键切换)
典型处理流程:
List<String> result = list.stream()
.filter(s -> s.length() > 3) // 过滤:长度>3
.map(String::toUpperCase) // 转换:转大写
.sorted() // 排序:自然顺序
.collect(Collectors.toList()); // 收集:转为List
三、实战练习题
练习1:Lambda表达式基础
任务:将以下匿名内部类改写成Lambda表达式
// 原代码(匿名内部类)
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("任务执行中...");
}
};
// 要求:改写成Lambda表达式
// 你的代码:
扩展挑战:
- 如果
run()方法中有多行代码,如何改写? - 如果接口有参数,如何简化写法?
练习2:集合遍历与过滤
任务:使用Stream API完成以下操作
给定学生列表:
List<Student> students = Arrays.asList(
new Student("张三", 85),
new Student("李四", 62),
new Student("王五", 91),
new Student("赵六", 58),
new Student("孙七", 73)
);
要求:
- 筛选出成绩≥60分的学生
- 提取学生姓名列表
- 按成绩降序排序
- 统计及格学生人数
模板代码:
List<Student> passedStudents = students.stream()
// 1. 过滤条件
.filter(student -> __________)
// 2. 排序(降序)
.sorted(____________________)
// 3. 收集结果
.collect(Collectors.toList());
List<String> names = passedStudents.stream()
// 4. 提取姓名
.map(____________________)
.collect(Collectors.toList());
long count = students.stream()
// 5. 统计及格人数
.filter(student -> __________)
.count();
练习3:复杂数据处理
任务:处理订单数据
class Order {
private String orderId;
private double amount;
private String customerName;
// getters/setters
}
List<Order> orders = Arrays.asList(
new Order("001", 1500.0, "张三"),
new Order("002", 800.0, "李四"),
new Order("003", 2500.0, "王五"),
new Order("004", 500.0, "张三"),
new Order("005", 1200.0, "李四")
);
要求:
- 计算所有订单的总金额
- 找出金额最大的订单
- 按客户分组,统计每个客户的总消费
- 筛选出金额>1000的订单,并按金额降序排列
提示函数:
mapToDouble():转换为Double流sum():求和max():求最大值groupingBy():分组Collectors.summingDouble():分组求和
四、图文总结模板
学习卡片模板
# 今日学习主题:Java Lambda表达式
## 核心收获(3个)
1. Lambda是__________,用于简化__________
2. 语法结构:__________ -> __________
3. 必须基于__________接口使用
## 难点与疑问
- 疑问1:如何理解"事实上的final"变量?
- 疑问2:什么时候使用方法引用?
## 代码示例(最深刻的一个)
```java
// 匿名内部类 → Lambda简化对比
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// Lambda简化版
list.forEach(s -> System.out.println(s));
关联知识
-
前置:匿名内部类、接口
-
后续:Stream API、函数式编程
知识图谱模板
Lambda表达式知识体系
基础概念
- 本质:匿名函数
- 语法:(参数) -> {代码}
- 前提:函数式接口
核心组件
-
参数列表
- 类型推断
- 单参数省略
- 无参数:()
-
箭头操作符
- 分隔作用
-
方法体
- 单行省略{}
- 返回值处理
应用场景
┌─────────┬──────────────┬─────────────────┐
│ 场景 │ 传统写法 │ Lambda简化 │
├─────────┼──────────────┼─────────────────┤
│ 集合遍历│ 匿名内部类 │ list.forEach() │
│ 线程创建│ new Runnable │ () -> {} │
│ 排序 │ Comparator │ (a,b) -> a-b │
└─────────┴──────────────┴─────────────────┘
注意事项
-
变量作用域限制
-
异常处理方式
-
可读性平衡
五、验收机制
知识测验(选择题)
题目1:关于Lambda表达式,以下说法正确的是?
A) Lambda可以用于任何接口
B) Lambda表达式必须有明确的返回类型声明
C) Lambda只能用于函数式接口(只有一个抽象方法)
D) Lambda表达式会修改源数据题目2:以下Lambda写法正确的是?
A)(int a, b) -> a + b
B)a -> {return a * 2;}
C)() -> System.out.println("Hello")
D)(String s) -> {s.toUpperCase()}题目3:Stream API中,以下属于终止操作的是?
A)filter()
B)map()
C)sorted()
D)collect()动手实操任务
任务名称:学生成绩管理系统数据处理
需求描述:
给定学生成绩数据,完成以下处理:- 筛选出成绩≥80分的优秀学生
- 计算班级平均分
- 找出成绩最高的学生
- 按分数段分组(90-100:优秀,80-89:良好,60-79:及格,<60:不及格)
数据准备:
javaList<Student> students = Arrays.asList( new Student("Alice", 92), new Student("Bob", 78), new Student("Charlie", 85), new Student("David", 65), new Student("Eve", 95), new Student("Frank", 58) );
要求:
- 使用Stream API完成所有操作
- 确保代码简洁,合理使用方法引用
- 输出格式清晰,包含必要的提示信息
扩展挑战:
- 并行处理大数据量(可模拟生成10000条数据)
- 自定义收集器实现复杂统计
验收标准
- 知识测验正确率≥80%(3题至少答对2题)
- 实操任务代码可编译运行,功能完整
- 能解释核心代码的运作原理
六、学习建议与时间规划
试学时间安排(建议2-3小时)
-
第1小时:观看视频教程(建议尚硅谷前2集)
- 了解Lambda基本概念
- 掌握基础语法
-
第2小时:阅读文档摘要 + 完成练习1-2
- 巩固理论知识
- 动手编码实践
-
第3小时:完成练习3 + 制作知识总结
- 复杂场景应用
- 知识体系梳理
后续学习节奏
- 工作日每天4小时 :
- 1小时视频/文档输入
- 2小时编码实战
- 1小时总结输出
- 每日输出:《今日执行卡片》
- 每周复盘:《周进展脑图》
遇到困难怎么办?
- 概念不理解:回看视频,查阅官方文档
- 代码报错:仔细阅读错误信息,逐行调试
- 进度滞后:调整学习重点,聚焦核心模块
- 需求帮助:技术社区提问(Stack Overflow、掘金)
