大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
综合练习
把本 track 串起来:用 Map + Stream 实现「课时目录」模块,补全单元测试与简单 CLI 导出。完成后进入 java-advanced-essentials 或 spring-boot-essentials。
学习目标
- 独立完成一次「集合 + Stream + 测试」的小项目
- 对照 jvc-intro 至 jvc-test 的知识点自检
- 规划进阶 Java 或 Spring Boot 的下一步
任务:LessonCatalog 模块
在 java-practice 的 Track / Lesson 思路上扩展:
1. 领域模型
public final class Lesson {
private final String slug;
private final String title;
private final int orderIndex;
public Lesson(String slug, String title, int orderIndex) { /* 校验 */ }
public String slug() { return slug; }
public String title() { return title; }
public int orderIndex() { return orderIndex; }
}
2. 用 Map 索引 + Stream 查询
public class LessonCatalog {
private final Map<String, Lesson> bySlug = new HashMap<>();
public void add(Lesson lesson) {
if (bySlug.containsKey(lesson.slug())) {
throw new IllegalArgumentException("duplicate: " + lesson.slug());
}
bySlug.put(lesson.slug(), lesson);
}
public List<Lesson> sortedLessons() {
return bySlug.values().stream()
.sorted(Comparator.comparingInt(Lesson::orderIndex))
.toList();
}
public List<Lesson> filterByPrefix(String prefix) {
return bySlug.values().stream()
.filter(l -> l.slug().startsWith(prefix))
.toList();
}
}
3. 导出 Markdown 清单(I/O)
用 jvc-io 的 Files.writeString 把 sortedLessons() 写成 - [slug](slug) title 列表。
4. 可选:虚拟线程批量校验
模拟对多个 slug 做 HTTP HEAD(可 stub),用 jvc-concurrency 的虚拟线程 executor 并发检查。
测试要求
- JUnit 5:至少 5 个用例(重复 slug、排序、前缀过滤、空目录、导出文件非空)
- Mockito 可选:mock 外部 slug 校验接口
mvn test或./gradlew test全绿(见 jvc-build)
自检清单
- 能口头解释 HashMap vs List 在本任务中的分工
- Stream 管道里有没有 共享可变状态
- 测试是否覆盖 异常路径(duplicate、非法参数)
- 说出一个适合交给 jva-collections 扩展的需求(如 Set 去重标签)
进阶路线
| 方向 | 链接 |
|---|---|
| 集合选型、Record、并发 | java-advanced-essentials |
| Web API + JPA | spring-boot-essentials |
| 语言基础复习 | java-fundamentals |
| 测试体系 | testing-essentials |
小结
Map 索引、Stream 查询、Files 导出、JUnit 守回归——核心 Java 的合格小项目不过如此。 本 track 完结;下一步进阶语法或把目录挂到 Spring Boot REST API。