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表达式的支持,功能强大,省代码
相关推荐
这是逗号操作符的结果,也就是说返回最后的一个值,小括号改变了这行代码的优先级,否则 var i = 1, 2, 3, 4, 5; 会报错缺少标识符. var i = (1, 2, 3, 4, function(){ return 5 * 5;}); 变量 i 最后的结果为 一个函数...
//方向代码:左37,上38,右39,下40 var direction=37; //蛇的初始坐标 var x=0; var y=0; //食物的初始化坐标 var foodX=0; var foodY=0; //当前的分 var score=0; //历史最高分记录 var bestScore=0; //画布的宽...
可以用来添加不向外部公开的方法,或者对jQuery的某些方法进行重新定义以提供新功能,或者提供更好的封装、避免名称空间冲突。当然,也可以用来开发插件,但Resig强烈建议在开发插件之前,先考虑jQuery UI widget...
(本来基于原型封装了一下,发现完全在增加代码量,又改回来了) 感谢sparks345提出粘贴时的问题 这样的话,只能多加几个事件onpropertychange,oninput, obj.watch(“value”,function(id,oval,nval){}) 具体可以看...
性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。 类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是 类。类描述了一组有相同特性...
书中的例子都比较浅显易懂...php /** * 策略模式 * 定义了算法族,分别封装起来,让它们之间可以互相替换, * 此模式让算法的变化独立于使用算法的客户。 */ //飞行行为接口 interface FlyBehavior { public function f
景观限制可能会根据新研究而改变技术因过时而改变传感器可能来自不同供应商,但精度不同预测未来需要占星术!把事情简单化缩短语义距离程序表达序列表达输入和输出之间关系的功能面向对象,用动作封装状态旨在捕获...
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 起点 我们将首先探讨锂离子电池...面向对象,用动作封装状态 旨在捕获重复方面的方面
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 起点 我们将首先探讨锂离子电池...面向对象,用动作封装状态 旨在捕获重复方面的方面
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 ...面向对象,用动作封装状态 旨在捕获重复方面的方面 扩展名 在您的代码上
景观限制可能会根据新研究而改变技术因过时而改变传感器可能来自不同供应商,但精度不同预测未来需要占星术!把事情简单化缩短语义距离程序表达序列表达输入和输出之间关系的功能面向对象,用动作封装状态旨在捕获...
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 起点 我们将首先探讨锂离子电池...面向对象,用动作封装状态 旨在捕获重复方面的方面
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 起点 我们将首先探讨锂离子电池...面向对象,用动作封装状态 旨在捕获重复方面的方面
景观限制可能会根据新研究而改变技术因过时而改变传感器可能来自不同供应商,但精度不同预测未来需要占星术!把事情简单化缩短语义距离程序表达序列表达输入和输出之间关系的功能面向对象,用动作封装状态旨在捕获...
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 起点 我们将首先探讨锂离子电池...面向对象,用动作封装状态 旨在捕获重复方面的方面
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 起点 我们将首先探讨锂离子电池...面向对象,用动作封装状态 旨在捕获重复方面的方面
景观限制可能会根据新研究而改变技术因过时而改变传感器可能来自不同供应商,但精度不同预测未来需要占星术!把事情简单化缩短语义距离程序表达序列表达输入和输出之间关系的功能面向对象,用动作封装状态旨在捕获...
编程范例 电动汽车拥有BMS-电池管理系统 可能的目的 充电时保护电池:在家中,公共场所,车辆内/再生制动中 估计寿命,库存和供应链 起点 我们将首先探讨锂离子电池...面向对象,用动作封装状态 旨在捕获重复方面的方面
景观限制可能会根据新研究而改变技术因过时而改变传感器可能来自不同供应商,但精度不同预测未来需要占星术!把事情简单化缩短语义距离程序表达序列表达输入和输出之间关系的功能面向对象,用动作封装状态旨在捕获...
景观限制可能会根据新研究而改变技术因过时而改变传感器可能来自不同供应商,但精度不同预测未来需要占星术!把事情简单化缩短语义距离程序表达序列表达输入和输出之间关系的功能面向对象,用动作封装状态旨在捕获...