java的supplier,这东西我就很迷,他直接返回一个值,这有什么意义么?直接传值不是更好么?
为什么要多此一举?
它的应用场景是什么能?能解决什么问题啊?会有什么特性么?
如果你单独看这个api,确实没啥大的用处,但是和别的一些结合起来使用,就会非常方便了。
举一个小例子,假设你有如下这个方法
public <T> void doSomething(T obj) {
if (obj.toString().equals("1")) {
// do
}
if (obj.toString().equals("2")) {
// do
}
// 保存数据
save(obj);
}
这个方法就是你所说的直接传入一个obj进去,那么如果说,一进到这个方法需要进行一大堆的判断,来修改这个obj的一些参数、或者一些回调之类的,修改完成后才会对这个obj进行他真正需要进行的操作,比如保存obj。这样写从逻辑上来讲是完全没有问题的,但是随之if变多,这个方法就会变的很臃肿,可读性也会随之很差,而且这又是一个比较简单的api,后期又不希望一直对其迭代...
由此Supplier就出现了,可把上面的代码改成如下
public <T> void doSomething(Supplier<T> obj) {
// 保存数据
save(obj.get());
}
改完之后这个方法就不需要在关心那些if了,直接obj.get()拿出来即用。当然坏处就是多出了很多Supplier。
一个api设计出来主要不是给开发这个api的人用的,而是调用这个api的人。你在开发这个api的时候,希望的是得到一个纯粹的可直接操作的obj,其他的一些处理方式,应该交由调用者自行去处理,这样就可以使用方法二。切记也不要盲目的使用,如果每个参数都加一层Supplier封装,那么这个api也是极其失败的。
一个供给型函数接口,可以配合Lambda使用
函数式接口
比如我要造轮胎,你有工具并且可以造轮胎
1.你可以把工具借给我,我自己造。相当于把一个对象当做参数(造轮胎工具)直接传递过去,再使用对象实例调用对应的方法。下次我想要座椅,又得找你拿造座椅的工具,并且自己使用,体现在代码上,是不是就要写好多个处理方法。一个获取座椅的方法,一个获取轮胎的方法
2.我不关心怎么造,也不会使用造轮胎工具,我去找第三方供货商,告诉他们给我一百个轮胎就行。相当于使用supplier(供货商),'T get()(相当于打个电话,轮胎就送过来了)'。下次想要座椅,该怎么办,还是找供货商打个电话。