longconsumer 是 java 8 引入的专用于接收 long 类型参数、执行无返回操作的函数式接口,避免装箱开销,适用于高频批量处理场景,支持 lambda、方法引用及 andthen 链式调用。

LongConsumer 是 Java 8 引入的原始类型特化函数式接口,专用于接收 long 基本类型参数、执行操作但不返回结果。它避免了 Consumer<long></long> 的自动装箱/拆箱开销,适合高频、批量处理长整型数据的场景。
核心作用:直接消费 long 值,零包装开销
与泛型 Consumer<long></long> 不同,LongConsumer 的 accept(long value) 方法直接操作基本类型 long,不创建 Long 对象。这意味着:
- 在循环或 Stream 处理中(如
LongStream.forEach()),不会触发装箱,减少 GC 压力; - 适用于日志记录、计数更新、状态校验等“只用不返”的操作;
- 不能传入
null——因为long是基本类型,天然非空。
常见使用方式
主要通过 Lambda 表达式或方法引用实现:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
Lambda 写法:
LongConsumer printer = l -> System.out.println("ID: " + l); -
方法引用:
LongConsumer logger = System.err::println; -
链式组合:用
andThen(LongConsumer after)串接多个操作,例如先验证再存储:LongConsumer validate = id -> { if (id LongConsumer save = id -> db.insert(id);<br> LongConsumer pipeline = validate.andThen(save);
典型应用场景
它常出现在以下 JDK API 中,是高效处理 long 数据流的关键组件:
-
LongStream.forEach(LongConsumer action)—— 遍历每个long元素; -
LongStream.forEachOrdered(LongConsumer action)—— 保证顺序执行; - 自定义工具类中作为回调参数,例如:
void processIds(LongConsumer handler) { ... }; - 配合
LongBinaryOperator或LongFunction构建完整数据处理链。
注意事项
使用时需注意几个关键细节:
- 不能用于需要
null语义的场景(比如可选 ID),此时应改用Consumer<long></long>; - 不支持泛型通配,
LongConsumer就是固定处理long,不可替代为其他数字类型; - 若操作中需抛出受检异常,需自行包装成运行时异常,因
accept()方法签名不声明 throws。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










