java 8 Function特性也出现了很久了,在项目用的越来越多,记录一下个人的感悟
1 函数式参数的编程思想,对callback功能的全面替代
这个很容易理解,callback本身就是接近函数式参数的一个概念,代码封装中常会对同一个方法中相同的部分抽取,不同的部分定义成callback,调用者提供具体的实现,使用过的类HibernateDaoSupport是一个很好的体现,使用Function,Consumer可以做完美的替代,下面是我们针对幂等操作(分布式锁提供锁支持)的一个封装
/** * 分布式锁支持,获取不到锁抛出IdempotentException * @param lockSuffix 锁前缀 * @param paramSupplier 提供的参数bean * @param actionFunction 处理参数的函数 * @param <T> 入参泛型 * @param <R> 返回值泛型 * @return * @throws IdempotentException */ public <T,R> R idempotentAction(String lockSuffix, Supplier<T> paramSupplier, Function<T, R> actionFunction) throws IdempotentException { //加锁操作 ZkMutex zkMutex = zkMutexClient.getDistributedLock(lockSuffix); logger.info("开始尝试获取锁!"); boolean getLock = zkMutex != null ? zkMutex.acquire(5, TimeUnit.SECONDS, 3) : false; logger.info("获取锁结束!获取结果:{}", getLock); try { if (!getLock) {//未获取到锁 logger.info("获取锁失败!稍后重试!"); throw new IdempotentException("获取锁失败,稍后重试"); } //逻辑块 return actionFunction.apply(paramSupplier.get()); } finally { if (getLock && zkMutex != null) { zkMutex.release(); logger.info("zk分布式释放锁"); } } }
ps: ZkMutex是继承自curator框架的InterProcessMutex类,提供了异常的屏蔽
/** * zk锁,提供一层封装,保证zk锁在任何异常情况下不影响正常程序执行 * Created by mxl on 2017/5/22. */ public class ZkMutex extends InterProcessMutex { private Logger logger = LoggerFactory.getLogger(ZkMutex.class); private CuratorFramework client; private String path; public ZkMutex(CuratorFramework client, String path) { super(client, path); this.client = client; this.path = path; } @Override public void acquire() throws Exception { try { super.acquire(); } catch (Exception e) { logger.error("获取锁失败!", e); } } @Override public boolean acquire(long time, TimeUnit unit) { try { return super.acquire(time, unit); } catch (Exception e) { logger.error("获取zk锁异常!", e); } return false; } /** * 获取锁,支持重试 * @param time * @param unit * @param tries * @return */ public boolean acquire(long time, TimeUnit unit, int tries) { for (int i = 0; i < tries; i++) { try { if (super.acquire(time, unit)) { return true; } } catch (Exception e) { logger.error("获取锁失败,重试次数:" + tries); } } return false; } @Override public void release() { try { super.release(); deleteNode(); } catch (Exception e) { logger.error("释放zk锁异常!", e); } } /** * 删除锁对于的节点 */ public void deleteNode() { try { List<String> children = this.client.getChildren().forPath(path); if (children == null || children.size() == 0) { this.client.delete().forPath(path); } } catch (Exception e) { logger.error("删除节点失败!", e); } } }
2 泛型封装对泛型对象的实例化
/** * 参数转换 * @param inputParam * @param outputParam * @param <T> * @param <R> * @return * @throws IllegalAccessException * @throws InvocationTargetException */ private <T, R> R convertParam (Supplier<T> inputParam, Supplier<R> outputParam) throws IllegalAccessException, InvocationTargetException{ T t = inputParam.get(); R r = outputParam.get(); if (t != null && r != null) { BeanUtils.copyProperties(r, t); } return r; }
3 最常用的就是集合转换成stream对各种lambda表达式的支持,功能强大,省代码
相关推荐
在IT行业中,Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。...了解并熟练掌握Ajax封装,对提升Web应用的用户体验和开发效率具有重要意义。
本篇文章通过对给定的AJAX代码及其封装方法的解析,深入探讨了AJAX技术的基本原理和实现方式。了解这些核心概念和技术细节有助于开发者更好地掌握AJAX,并将其应用于实际项目中。在.NET平台下,利用AJAX可以极大地...
5. **编译和封装**:完成代码编写后,使用MATLAB的编译器将S-Function转换为可执行代码,然后将其封装到Simulink库中,以便在模型中调用。 6. **建立Simulink模型**:在Simulink环境中,创建一个新的模型,添加S-...
MD5的主要特性包括抗修改性和抗碰撞性,即微小的输入变化会带来显著不同的输出,而找到两个不同输入产生相同输出的碰撞非常困难。 在JavaScript中实现MD5: 在JavaScript中实现MD5加密通常依赖于第三方库,如`...
在提供的文件列表中,“bengji.m”很可能包含了用MATLAB编写的S-function代码,而“bengji.slx”是Simulink模型文件,其中调用了S-function模块。通过打开和分析这两个文件,可以更详细地理解S-function在蹦极系统中...
- 初级封装:这是最基本的封装形式,通常表现为将一系列相关的操作组织成一个函数,如上述例子中的`function sum(x, y: integer): integer;`,将加法运算封装在一个函数内,避免了重复代码。 - 中级封装:进一步地...
同时,当项目需求变化时,只需要修改封装类的代码,而无需修改调用它的所有地方,降低了代码的复杂度。 总之,PHP中的Curl封装类是一个实用的工具,它可以帮助开发者更好地组织和控制HTTP请求。通过理解和使用此类...
4. **接口扩展:**可以使用S-Function来封装现有的库函数或API,以便在Simulink环境中直接使用。 #### 怎样编写S-Function S-Function可以通过两种主要方式编写: 1. **M-文件S-Function:**使用MATLAB脚本语言...
- 如何自动生成S-Function代码。 - 如何配置生成的S-Function。 - S-Function Builder工具的使用方法。 #### 进程层面与数据层面 S-Function与Simulink引擎之间的交互主要发生在两个层面上: - **进程层面**:涉及...
在 Vue3 中,主要的变化包括 Composition API 的引入,它允许开发者更灵活地组织代码,以及对 TypeScript 的原生支持,可以提供更好的类型检查和代码提示。 首先,让我们深入了解一下 Vuetify3 中的 Snackbar 组件...
本文将深入讲解Highcharts的封装、刷新和重绘方法,并提供相关代码示例。 ### 1. Highcharts的封装 封装Highcharts是为了更好地管理和复用图表配置,使其适应不同的应用场景。通常,我们会创建一个自定义函数,...
本篇文章将深入探讨如何对 jqGrid 进行二次封装,以适应个性化的需求,提高代码的可复用性和维护性。 ### 1. jqGrid 基础 在了解二次封装之前,我们需要对 jqGrid 的基本使用有所了解。jqGrid 支持 JSON、XML 和 ...
**AngularJS 封装 jQuery Datepicker 知识点详解** 在Web开发中,日期选择器是一个常见的组件,用于用户输入日期或选择日期范围。AngularJS 和 jQuery 的结合使用可以为开发者提供更强大的功能和更好的用户体验。这...
为了改善这种状况,我们可以使用Promise进行封装,使代码更符合现代JavaScript的编程习惯,同时加入过期时间功能,提高用户体验。以下是对这些知识点的详细解释: 1. **Promise**:Promise是ES6引入的一种处理异步...
10. S-Function的封装与遮罩(masking):S-Function可以通过Simulink的遮罩技术来隐藏复杂的实现细节,通过图形化界面提供更简洁的用户交互。这对于创建易于使用的自定义模块非常重要。 通过这些知识点,我们可以...
使用这个封装的AJAX函数,你可以轻松地在代码中发起异步请求,比如获取某个API的数据: ```javascript ajaxGet('https://api.example.com/data', function(err, data) { if (err) { console.error(err); } else ...
在这个全局库文件中,封装的FC可能包含了对模拟量输入和输出的读取、转换、滤波以及控制逻辑等操作。 "全局库文件"则是指在TIA博途中可以跨项目共享的函数块和变量集合。这种库允许用户创建标准化的代码片段,可以...
在微信小程序开发中,Promise 是一个非常重要的工具,它用于处理异步操作,使得...在项目中的`微信小程序`文件中,你应该会找到具体的封装实现和示例,可以参考这些代码加深对Promise的理解,并应用到自己的项目中。
在本文中,我们将深入探讨如何使用C语言和...通过对"S_Function_lisanyu.slx"和"S_Function_lianxuyu.slx"这两个模型的比较和学习,我们可以进一步提升对S-Function和Buck电路的理解,以及在实际工程中的应用能力。