核心是全程避免原始类型装箱拆箱——优先使用intpredicate等原始类型函数式接口,创建intstream等原始流,选用fastutil的intarraylist等原始集合,中间变量用int/long,解包后运算。

核心是让原始类型全程不碰堆对象——从接口选择、数据源头、流操作到集合结构,全部绕过泛型包装层。
优先用原始类型专用函数式接口
别写 Predicate
- IntPredicate test(int value):输入是栈上 int,不拆箱
-
ToIntFunction
applyAsInt(T t) :返回 int,不 new Integer - 同理还有 DoubleSupplier、ToLongBiFunction 等,按数值类型对号入座
Stream 操作全程保持原始类型
别让数据先变成 Stream
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用 IntStream.range(0, 1000),而不是 Stream.iterate(0, i -> i + 1).limit(1000)
- 数组转流用 Arrays.stream(intArray)(返回 IntStream),别用 Arrays.asList(intArray).stream()(先装箱)
- 聚合时直接调 sum()、max()、average(),返回 int 或 OptionalDouble,不生成 Optional
集合与存储结构避开包装类容器
List
- 用 fastutil 的 IntArrayList 或 Eclipse Collections 的 IntList,底层存的是 int[]
- Android 开发可选 SparseArray
,键为原始 int,零装箱 - 纯计算场景尽量用原始数组 int[],配合 IntStream.of(arr) 启动处理
运算和赋值时守住基本类型变量
只要不涉及 null 语义或泛型约束,中间变量一律用 int、long:
- 接收包装类值后立刻解包:Integer a = getA(); int raw = a != null ? a : 0;
- 避免三元表达式隐式装箱:Integer x = flag ? 123456 : null; → 超出缓存范围会每次 new;应改为显式控制
- 算术运算别留在包装类上:list.stream().reduce(0, Integer::sum) 仍要反复拆箱;换成 IntStream.of(...).sum()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










