IntSupplier 是 Java 8 提供的函数式接口,用于按需返回原始 int 值,仅含 getAsInt() 方法,避免装箱开销;区别于 Supplier<Integer>,适用于高性能数值场景如 Stream 操作和延迟初始化。

IntSupplier 是 Java 8 引入的函数式接口,专门用于**按需提供一个 int 值**,不接收任何参数,只通过 getAsInt() 方法返回原始 int 类型。
调用 getAsInt() 获取 int 值
这是唯一且必须实现的方法。只要持有 IntSupplier 实例,直接调用它即可拿到 int:
- 不是通过
get()(那是Supplier<T>的方法) - 也不是通过泛型类型转换——它天生就面向原始
int,避免装箱开销 - 例如:
int value = myIntSupplier.getAsInt();
常见创建方式与使用示例
你可以用 Lambda、方法引用或匿名内部类构造 IntSupplier:
- Lambda:
IntSupplier randomInt = () -> new Random().nextInt(100); - 固定值:
IntSupplier always42 = () -> 42; - 方法引用(静态):
IntSupplier currentNano = System::nanoTime;(注意返回值是long,需适配)→ 实际中要确保返回int,如() -> (int)System.nanoTime()
和 Supplier<Integer> 的关键区别
别混淆两者:
立即学习“Java免费学习笔记(深入)”;
-
IntSupplier→ 返回int(原始类型),无装箱,性能好,专用于数值场景 -
Supplier<Integer>→ 返回Integer(对象),每次调用可能触发自动装箱,有额外开销 - 如果你需要的是原始
int,尤其在循环、Stream 的mapToInt或高性能计算中,优先选IntSupplier
典型应用场景
它常出现在需要延迟生成或重复获取 int 值的地方:
- 初始化默认值:
int x = config.getInt("timeout", () -> 30000);(仅当配置缺失时才执行) - Stream 操作:
IntStream.generate(counter).limit(5).forEach(System.out::println);(counter是IntSupplier) - 测试中模拟动态返回值:比如每次调用返回递增的序号


















