介绍直接看这篇文章比较详细:【Java 基础篇】Java Supplier 接口详解
Supplier 是 Java 8 引入的一个函数式接口,它属于 java.util.function 包。Supplier 接口表示一个不接受任何参数但返回某种类型结果值的函数。它定义了一个 get() 方法,该方法没有参数,但返回一个泛型 T 类型的值。
Supplier 接口常用于以下场景:
延迟计算或生成值: 在某些情况下,你可能希望只有在真正需要结果时才进行计算或生成值。使用 Supplier,你可以将计算或生成值的逻辑封装在 get() 方法中,并在需要时调用它。
提供默认值: 当某个方法需要返回一个值时,但此时没有合适的值可返回时,可以使用 Supplier 来提供一个默认值。
与 Stream API 结合使用: 在 Java 8 的 Stream API 中,Supplier 可以与 Stream.generate() 方法一起使用,以生成一个无限流,其中每个元素都是通过调用 Supplier 的 get() 方法获得的。
实战中的使用:
例如有方法如下
public long nextId(){
if (enabled.get()) {
return idGen.nextId();
}
throw new ForbidOperationException(ErrorCode.FORBID_GENERATE_SEQRULE_EXCEPTION);
}
public String nextCode(Map<String, String> params){
return CodeGenerator.getInstance().create(ruleId, nextId(), callBackTime(), params);
}
在nextCode()
方法中,传入的参数有nextId()
方法返回的结果。但实际场景中,我希望nextId()
方法能在CodeGenerator.getInstance().create
执行中途再执行而不是传入参数前执行(有数据校验问题),就可以用到Supplier函数式接口
其中针对long类型返回值的LongSupplier
接口,以实现其提供的延迟计算或生成值
功能
改造后的代码:
public String nextCode(Map<String, String> params) {
LongSupplier func = new LongSupplier() {
@Override
public long getAsLong() {
return nextId();
}
};
return CodeGenerator.getInstance().create(ruleId, func, callBackTime(), params);
}
用lambda表达式进一步改造:
public String nextCode(Map<String, String> params) {
LongSupplier func = this::nextId;
return CodeGenerator.getInstance().create(ruleId, func, callBackTime(), params);
}
之后在CodeGenerator.getInstance().create
方法里就可以在合适的地方使用func.getAsLong()
进行调用了
最近新项目提测阶段已经连续加班两个多月了,天天弄到23点,顶不住呀,好久没更新文章了,过段时间忙完了应该就会恢复更新了。
THX bros