本文介绍如何使用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() <blockquote><p>⚠️ 注意:请确保已在 Main 类顶部添加 import java.util.stream.Collectors;,否则 Collectors.toList() 将无法编译。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill10666" title="Java Api Extractor"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20d3191a227.jpg" alt="Java Api Extractor" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill10666" title="Java Api Extractor" class="overflowclass">Java Api Extractor</a>
<p class="overflowclass">从 Java 项目中提取 Controller 层接口定义为 JSON 数据。</p>
</div>
<a rel="nofollow" href="/xiazai/skill10666" title="Java Api Extractor" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div></blockquote>
<h3>? 补充说明与最佳实践</h3>
<ul>
<li>
<strong>边界处理</strong>:上述条件 >= min && minimumPrice。</li>
<li>
<strong>空集合安全</strong>:添加了 isEmpty() 判断,避免输出空列表时造成用户困惑。</li>
<li>
<strong>不修改原数据</strong>:stream().filter() 返回新列表,原始 toys 集合保持不变,符合函数式编程原则。</li>
<li>
<strong>性能提示</strong>:对于小规模玩具列表( 并利用 subSet() 加速范围查询(需确保 Toy 正确实现 Comparable —— 您当前已通过 cost 实现,但注意 compareTo() 应保持与 equals() 逻辑一致)。</li>
</ul>
<h3>?️ 小修复建议(提升健壮性)</h3>
<ol>
<li>
<strong>拼写修正</strong>:MainMenu() 中 switch (selecMenu) 应为 switch (selectMenu)(原文漏掉 t),否则编译失败;</li>
<li>
<strong>toString() 健全性</strong>:当前 Toy.toString() 引用了未初始化的 this.name(仅在子类如 Car/Doll 中赋值),建议在 Toy 构造器中初始化 name = "Unknown Toy",或在 toString() 中使用 "[" + getClass().getSimpleName() + "]" 替代 this.name,防止 NullPointerException;</li>
<li>
<strong>输入清理</strong>:scanner.nextInt() 后建议调用 scanner.nextLine() 清除换行符,避免后续 nextLine() 被跳过(尤其在混合使用时)。</li>
</ol>
<p>完成以上改进后,您的玩具价格筛选功能即可稳定运行,兼具简洁性与可维护性。该方案也易于扩展——例如后续增加“按年龄段+价格联合筛选”,只需在 filter() 中叠加更多条件即可。</p></toy>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










