核心是全程避免基本类型与包装类互转:使用原始类型函数式接口、原始流、专用集合及原始数组,变量声明优先用基本类型,杜绝隐式装箱拆箱。

核心是让基本类型全程不碰堆对象——从数据源头、接口选择、流操作到集合结构,全部绕过泛型包装层。
用原始类型专用函数式接口
别写 Predicate
-
IntPredicate:
test(int value),输入直接是栈上 int,不拆箱 -
ToIntFunction
: applyAsInt(T t),返回 int,不 new Integer - LongConsumer、ToDoubleBiFunction 等,按数值类型对号入座
Stream 操作全程保持原始类型
别让数据先变成 Stream
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 创建用
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;超出缓存范围(-128~127)会每次 new,应显式控制 - 算术运算别留在包装类上:
list.stream().reduce(0, Integer::sum)仍反复拆箱;换成IntStream.of().sum()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










