当前位置:  开发笔记 > 编程语言 > 正文

当人们可以调用方法时,为什么会使用`java.util.function.supplier`?

如何解决《当人们可以调用方法时,为什么会使用`java.util.function.supplier`?》经验,为你挑选了2个好方法。

我在https://dzone.com/articles/supplier-interface上看到了一些使用供应商界面的例子.

我的问题是,如果在上面的例子中,我可以做一些简单的事情:

driveVehicle(new Vehicle());
driveVehicle(new Car());

为什么要使用供应商界面,如果它只是调用方法,而不接受任何参数.



1> Jean-Françoi..:

假设您在数据库中存储了要在整个应用程序中保持不变的参数

// Assume retrieveSystemParameter query database which allows to change parameters
public static String SYSTEM_PARAMETER = StaticUtilities.retrieveSystemParameter();

该值将初始化一次,并且不会更改,直到重新部署.话虽如此,如果您使用供应商:

public static Supplier SYSTEM_PARAMETER_SUPPLIER = StaticUtilities::retrieveSystemParameter;

当您需要某个值时,您将调用SYSTEM_PARAMETER_SUPPLIER.get()哪个值将在需要时检索数据库中的参数 - 这样,如果更改数据库中的参数,则无需重新部署.

如您所见,供应商很懒惰.当你要求他们工作时(通过调用.get()),他们会完成工作 - 如果你明智地处理它们,这可能会让你获得一些性能提升.有时您会调用一个方法,该方法期望X传递方法的变量retrieveX,然后最终不需要X在方法中,因为某些条件不满足.在这种情况下,您将失去性能,因为您将执行要检索的代码,X而检索的供应商X只会在调用时执行它,.get并且只有满足条件才会执行该调用.


免责声明:系统参数常量只是我想到的第一个例子,但考虑到它在每个.get()上查询数据库,你宁可缓存参数并在特定的时间间隔内调用缓存.get().



2> g-t..:

我猜可选可能是完美的例子.请考虑以下代码段:

final Product firstProduct = Optional.ofNullable(product)
        .orElse(productDao.findProductById(id));

final Product secondProduct = Optional.ofNullable(product)
        .orElseGet(() -> productDao.findProductById(id));

您获得的产品可能为空.为了确定firstProduct,java必须在orElse方法中调用表达式,因此无论产品是否为null,您始终必须确定在产品为null的情况下将返回的值.

为了确定secondProduct数据库,如果产品不为null,则不必查询,因为您传递的是仅当product为null时才会调用的Supplier.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有