`

Function 对代码封装带来的改变

阅读更多

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表达式的支持,功能强大,省代码

 

分享到:
评论

相关推荐

    ajax封装实例代码

    在IT行业中,Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。...了解并熟练掌握Ajax封装,对提升Web应用的用户体验和开发效率具有重要意义。

    ajax代码及简单封装

    本篇文章通过对给定的AJAX代码及其封装方法的解析,深入探讨了AJAX技术的基本原理和实现方式。了解这些核心概念和技术细节有助于开发者更好地掌握AJAX,并将其应用于实际项目中。在.NET平台下,利用AJAX可以极大地...

    使用S-Function函数实现离散PID控制器,并建立simulink仿真模型

    5. **编译和封装**:完成代码编写后,使用MATLAB的编译器将S-Function转换为可执行代码,然后将其封装到Simulink库中,以便在模型中调用。 6. **建立Simulink模型**:在Simulink环境中,创建一个新的模型,添加S-...

    加密解密md5的js封装代码

    MD5的主要特性包括抗修改性和抗碰撞性,即微小的输入变化会带来显著不同的输出,而找到两个不同输入产生相同输出的碰撞非常困难。 在JavaScript中实现MD5: 在JavaScript中实现MD5加密通常依赖于第三方库,如`...

    S-function模块案例详解(MATLAB程序)

    在提供的文件列表中,“bengji.m”很可能包含了用MATLAB编写的S-function代码,而“bengji.slx”是Simulink模型文件,其中调用了S-function模块。通过打开和分析这两个文件,可以更详细地理解S-function在蹦极系统中...

    OOP面向对象的封装有关面试

    - 初级封装:这是最基本的封装形式,通常表现为将一系列相关的操作组织成一个函数,如上述例子中的`function sum(x, y: integer): integer;`,将加法运算封装在一个函数内,避免了重复代码。 - 中级封装:进一步地...

    php实现的Curl封装类

    同时,当项目需求变化时,只需要修改封装类的代码,而无需修改调用它的所有地方,降低了代码的复杂度。 总之,PHP中的Curl封装类是一个实用的工具,它可以帮助开发者更好地组织和控制HTTP请求。通过理解和使用此类...

    Matlab S-Function的编写

    4. **接口扩展:**可以使用S-Function来封装现有的库函数或API,以便在Simulink环境中直接使用。 #### 怎样编写S-Function S-Function可以通过两种主要方式编写: 1. **M-文件S-Function:**使用MATLAB脚本语言...

    S-function 使用指导

    - 如何自动生成S-Function代码。 - 如何配置生成的S-Function。 - S-Function Builder工具的使用方法。 #### 进程层面与数据层面 S-Function与Simulink引擎之间的交互主要发生在两个层面上: - **进程层面**:涉及...

    VUE3二次封装vuetify3的snackbar

    在 Vue3 中,主要的变化包括 Composition API 的引入,它允许开发者更灵活地组织代码,以及对 TypeScript 的原生支持,可以提供更好的类型检查和代码提示。 首先,让我们深入了解一下 Vuetify3 中的 Snackbar 组件...

    highcharts封装 刷新 重绘 方法代码

    本文将深入讲解Highcharts的封装、刷新和重绘方法,并提供相关代码示例。 ### 1. Highcharts的封装 封装Highcharts是为了更好地管理和复用图表配置,使其适应不同的应用场景。通常,我们会创建一个自定义函数,...

    数据列表组件 jqGrid 二次封装

    本篇文章将深入探讨如何对 jqGrid 进行二次封装,以适应个性化的需求,提高代码的可复用性和维护性。 ### 1. jqGrid 基础 在了解二次封装之前,我们需要对 jqGrid 的基本使用有所了解。jqGrid 支持 JSON、XML 和 ...

    AngularJS封装jQuery Datepicker

    **AngularJS 封装 jQuery Datepicker 知识点详解** 在Web开发中,日期选择器是一个常见的组件,用于用户输入日期或选择日期范围。AngularJS 和 jQuery 的结合使用可以为开发者提供更强大的功能和更好的用户体验。这...

    使用Promise封装wx.request wx.setStorage封装,实现设置过期时间

    为了改善这种状况,我们可以使用Promise进行封装,使代码更符合现代JavaScript的编程习惯,同时加入过期时间功能,提高用户体验。以下是对这些知识点的详细解释: 1. **Promise**:Promise是ES6引入的一种处理异步...

    《MATLAB的S-Function编写指导》

    10. S-Function的封装与遮罩(masking):S-Function可以通过Simulink的遮罩技术来隐藏复杂的实现细节,通过图形化界面提供更简洁的用户交互。这对于创建易于使用的自定义模块非常重要。 通过这些知识点,我们可以...

    JS封装的AJAX函数

    使用这个封装的AJAX函数,你可以轻松地在代码中发起异步请求,比如获取某个API的数据: ```javascript ajaxGet('https://api.example.com/data', function(err, data) { if (err) { console.error(err); } else ...

    微信小程序(es6 promise封装)

    在微信小程序开发中,Promise 是一个非常重要的工具,它用于处理异步操作,使得...在项目中的`微信小程序`文件中,你应该会找到具体的封装实现和示例,可以参考这些代码加深对Promise的理解,并应用到自己的项目中。

    仿真.zip_C语言_S-function_SIMULINK_s-function电路

    在本文中,我们将深入探讨如何使用C语言和...通过对"S_Function_lisanyu.slx"和"S_Function_lianxuyu.slx"这两个模型的比较和学习,我们可以进一步提升对S-Function和Buck电路的理解,以及在实际工程中的应用能力。

    vue3+ts+echarts实现echarts封装

    Vue3的发布带来了许多性能优化和新特性,如Composition API,使得代码更加模块化和可复用。同时,TypeScript作为JavaScript的超集,增加了静态类型检查,提高了代码质量和可维护性。而ECharts则是一款优秀的数据可视...

Global site tag (gtag.js) - Google Analytics