Java使用java函数表达式抽象出通用代码

标签 java lambda java-8

有 2 个函数除了一行之外具有相同的代码。

public ResponseEntity<String> deleteJob(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

        if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
            return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

        schedulerFactoryBean.getScheduler().deleteJob(jobKey);//Different Code line
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
    }

public ResponseEntity<String> resumeJob(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

        if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
            return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

        schedulerFactoryBean.getScheduler().resumeJob(jobKey);//Different Code line
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
    }

我想从这两个函数中删除重复的代码。

一个简单的解决方案是编写第三个通用函数并从两个函数调用它。但是我一直在寻找是否有一种方法,我可以使用 Lambda 表达式来传递不同的代码功能。

类似

public ResponseEntity<String> processJob(String jobName, String jobGroup, Function<String,String> jobfunction) {
        JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

        if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
            return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

        jobfunction.apply(jobKey);//Apply the required code behaviour
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
    }

然后调用该函数

processJob(jobName,jobGroup, <lambda expression with delete/resume function calling>)

最佳答案

如何使用枚举定义来简化调度程序可以执行的所有可能操作

enum Action {
    DELETE, RESUME
}

并进一步将如何处理作业的意识作为参数传递下去——

public ResponseEntity<String> processJob(String jobName, String jobGroup, Action action) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

    if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

    performSchedulerAction(schedulerFactoryBean.getScheduler(), jobKey, action);
    return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
}

它使用私有(private)方法,例如

private void performSchedulerAction(Scheduler scheduler, JobKey jobKey, Action action) {
    switch (action) {
        case DELETE -> scheduler.deleteJob(jobKey);
        case RESUME -> scheduler.resumeJob(jobKey);
        default -> throw new IllegalArgumentException("no such case");
    }
}

关于Java使用java函数表达式抽象出通用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60914596/

相关文章:

Jpa @OnetoOne 与 Java8 的关系

java - 如何在 C++ 类中声明二维数组?

java - Java实例之间的变量溢出

java - Android Pie 中的图像从图库上传到服务器的问题

c# - 使用 lambda 将带有列表的元素列表转换为单个列表

java - 在Java中使用Optional和null检查的最佳方法是什么?

java - 使用 Rijndael 在 .Net 中加密的 java 中解密文件时出错

mysql - MySQL查询之Lambda表达式查询

c++ - 将 decltype 和 std::function 与 lambda 结合使用

java - 在以下代码中使用 map 时出错