综合练习
Stream + 单元测试小模块。
40 分钟
综合练习
把本 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)