本文介绍如何使用java stream api实现按用户输入的最低价和最高价动态筛选玩具集合,并将匹配结果输出到控制台。
本文介绍如何使用java stream api实现按用户输入的最低价和最高价动态筛选玩具集合,并将匹配结果输出到控制台。
在构建玩具管理系统时,一个常见且实用的功能是支持按价格区间检索商品。本教程将基于您已有的 Toy 类和主菜单结构,完整实现“按价格搜索”功能(对应菜单选项 4),并确保代码健壮、可读性强、符合面向对象设计原则。
✅ 核心实现:使用 Stream 过滤价格范围
在 SearchMenu() 方法中,我们不再手动遍历 ArrayList,而是采用现代 Java 的 Stream API 实现声明式过滤。以下是推荐的完整实现:
private static void SearchMenu() {
System.out.println("Search by price -");
System.out.print("Enter the minimum price: ");
int minimumPrice = scanner.nextInt();
System.out.print("Enter the maximum price: ");
int maximumPrice = scanner.nextInt();
// 使用 Stream 过滤价格在 [min, max] 区间内的玩具(含边界)
List<Toy> filtered = toys.stream()
.filter(toy -> toy.getCost() >= minimumPrice && toy.getCost() <= maximumPrice)
.collect(Collectors.toList());
// 输出结果
if (filtered.isEmpty()) {
System.out.println("No toys found in the specified price range.");
} else {
System.out.println("\nFound " + filtered.size() + " toy(s):");
filtered.forEach(System.out::println);
}
MainMenu(); // 返回主菜单
}⚠️ 注意:请确保已在 Main 类顶部添加 import java.util.stream.Collectors;,否则 Collectors.toList() 将无法编译。
? 补充说明与最佳实践
- 边界处理:上述条件 >= min && minimumPrice。
- 空集合安全:添加了 isEmpty() 判断,避免输出空列表时造成用户困惑。
- 不修改原数据:stream().filter() 返回新列表,原始 toys 集合保持不变,符合函数式编程原则。
- 性能提示:对于小规模玩具列表( 并利用 subSet() 加速范围查询(需确保 Toy 正确实现 Comparable —— 您当前已通过 cost 实现,但注意 compareTo() 应保持与 equals() 逻辑一致)。
?️ 小修复建议(提升健壮性)
- 拼写修正:MainMenu() 中 switch (selecMenu) 应为 switch (selectMenu)(原文漏掉 t),否则编译失败;
- toString() 健全性:当前 Toy.toString() 引用了未初始化的 this.name(仅在子类如 Car/Doll 中赋值),建议在 Toy 构造器中初始化 name = "Unknown Toy",或在 toString() 中使用 "[" + getClass().getSimpleName() + "]" 替代 this.name,防止 NullPointerException;
- 输入清理:scanner.nextInt() 后建议调用 scanner.nextLine() 清除换行符,避免后续 nextLine() 被跳过(尤其在混合使用时)。
完成以上改进后,您的玩具价格筛选功能即可稳定运行,兼具简洁性与可维护性。该方案也易于扩展——例如后续增加“按年龄段+价格联合筛选”,只需在 filter() 中叠加更多条件即可。
立即学习“Java免费学习笔记(深入)”;


















