Ame*_*kar 3 java lambda java-8 functional-interface
我在https://dzone.com/articles/supplier-interface上看到了一些使用供应商界面的例子.
我的问题是,如果在上面的例子中,我可以做一些简单的事情:
driveVehicle(new Vehicle());
driveVehicle(new Car());
Run Code Online (Sandbox Code Playgroud)
为什么要使用供应商界面,如果它只是调用方法,而不接受任何参数.
假设您在数据库中存储了要在整个应用程序中保持不变的参数
// Assume retrieveSystemParameter query database which allows to change parameters
public static String SYSTEM_PARAMETER = StaticUtilities.retrieveSystemParameter();
Run Code Online (Sandbox Code Playgroud)
该值将初始化一次,并且不会更改,直到重新部署.话虽如此,如果您使用供应商:
public static Supplier<String> SYSTEM_PARAMETER_SUPPLIER = StaticUtilities::retrieveSystemParameter;
Run Code Online (Sandbox Code Playgroud)
当您需要某个值时,您将调用SYSTEM_PARAMETER_SUPPLIER.get()哪个值将在需要时检索数据库中的参数 - 这样,如果更改数据库中的参数,则无需重新部署.
如您所见,供应商很懒惰.当你要求他们工作时(通过调用.get()),他们会完成工作 - 如果你明智地处理它们,这可能会让你获得一些性能提升.有时您会调用一个方法,该方法期望X传递方法的变量retrieveX,然后最终不需要X在方法中,因为某些条件不满足.在这种情况下,您将失去性能,因为您将执行要检索的代码,X而检索的供应商X只会在调用时执行它,.get并且只有满足条件才会执行该调用.
免责声明:系统参数常量只是我想到的第一个例子,但考虑到它在每个.get()上查询数据库,你宁可缓存参数并在特定的时间间隔内调用缓存.get().
我猜可选可能是完美的例子.请考虑以下代码段:
final Product firstProduct = Optional.ofNullable(product)
.orElse(productDao.findProductById(id));
final Product secondProduct = Optional.ofNullable(product)
.orElseGet(() -> productDao.findProductById(id));
Run Code Online (Sandbox Code Playgroud)
您获得的产品可能为空.为了确定firstProduct,java必须在orElse方法中调用表达式,因此无论产品是否为null,您始终必须确定在产品为null的情况下将返回的值.
为了确定secondProduct数据库,如果产品不为null,则不必查询,因为您传递的是仅当product为null时才会调用的Supplier.
| 归档时间: |
|
| 查看次数: |
3427 次 |
| 最近记录: |