直接用 if。库存阈值判断是简单遍历检查,非聚合场景,stream() 带来额外开销且易误写低效代码,几十到几百条记录下传统 if 或 for 更直白、易调试。

库存阈值判断用 if 还是 stream().anyMatch()?
直接用 if。控制台预警本质是“查一遍就报警”,不是数据聚合或过滤场景。stream() 带来额外对象开销,还容易让新手误写成 stream().filter().findFirst() 这种低效写法。真实库存检查往往只有几十到几百条记录,for 循环或传统 if 更直白、更易调试。
- 别为了“显得函数式”而用
stream()—— 预警逻辑里没并发、没链式转换需求 - 如果库存数据存在
List<product></product>中,每个Product有stock和minStock字段,直接遍历比较最稳妥 - 注意浮点数比较陷阱:库存量如果是
double,别写stock ,改用 <code>Double.compare(stock, minStock)
Scanner 读取用户输入后为什么卡住不继续?
因为 Scanner.nextLine() 和 nextInt() 混用时,nextInt() 不吞掉换行符,导致后续 nextLine() 立刻读到空行。这是控制台程序最常崩的点。
- 统一用
nextLine()读所有输入,再手动转类型:Integer.parseInt(scanner.nextLine().trim()) - 或者在每次
nextInt()后补一句scanner.nextLine()清缓冲区 - 别信“只读一次就完事”——控制台交互必然要循环处理,必须考虑输入流状态残留
用 ArrayList 存库存,新增商品时重复添加怎么办?
Java 的 ArrayList 不去重,靠代码逻辑控制。你得自己加判断,而不是指望集合自动识别“同名商品”。否则预警时同一商品可能被扫两遍,阈值告警翻倍触发。
- 新增前先用
list.stream().anyMatch(p -> p.getName().equals(newName))查重(注意null安全) - 更稳妥的做法是把库存改成
Map<string product></string>,用商品名作 key,天然避免重复且查找 O(1) - 如果坚持用
ArrayList,记得重写Product的equals()和hashCode(),否则contains()判定失效
控制台输出预警信息,中文乱码怎么快速定位?
大概率是 IDE 或终端编码不一致,不是 Java 源码问题。Windows 默认是 GBK,而多数 IDE(IntelliJ、VS Code)新建文件用 UTF-8,运行时没指定参数就会错乱。
立即学习“Java免费学习笔记(深入)”;
- 先确认源码保存编码:在 IDE 里看右下角,确保是 UTF-8
- 运行时加 JVM 参数:
-Dfile.encoding=UTF-8(IDE 运行配置里加到 VM options) - 命令行运行时,Windows 用户别用默认 cmd,改用
chcp 65001 && java YourApp切到 UTF-8 页 - 别在
System.out.println()里硬拼接 Unicode 转义,比如"\u4f4e\u5e93\u5b58",可读性差还容易粘连
"10" 居然为真。这些都不是语法错误,而是逻辑断点,得靠真实输入跑几遍才能暴露。










