Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8:在一个对象上应用方法列表_Java_Java 8 - Fatal编程技术网

Java8:在一个对象上应用方法列表

Java8:在一个对象上应用方法列表,java,java-8,Java,Java 8,我在代码中有一个特殊的部分,我想做的就是下面的内容,但是我无法以一种不涉及代码重复的方式编写代码。是否有一种方法可以声明方法列表,然后将其应用于productFeatureValidationDto。我目前的做法是不切实际的 public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(ProductFeatureValidationDto productFeatureValidationDto) t

我在代码中有一个特殊的部分,我想做的就是下面的内容,但是我无法以一种不涉及代码重复的方式编写代码。是否有一种方法可以声明方法列表,然后将其应用于
productFeatureValidationDto
。我目前的做法是不切实际的

public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(ProductFeatureValidationDto productFeatureValidationDto) throws
        ApplicationException, ParseException {
    ValidateProductFeatureResponse response;
    response = this.validateProductFeatureA(productFeatureValidationDto);
    if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
        return response;
    }
    response = this.validateProductFeatureB(productFeatureValidationDto);
    if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
        return response;
    }
    response = this.validateProductFeatureA(productFeatureValidationDto);
    if(response.getStatus().equalsIgnoreCase(MPResponseStatus.FAILURE.name())){
        return response;
    }
    response = this.validateProductFeatureC(productFeatureValidationDto);
    if(response.getStatus().equalsIgnoreCase(MPResponseStatus.FAILURE.name())){
        return response;
    }
    response = this.validateProductFeatureD(productFeatureValidationDto);
    if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
        return response;
    }
    response = this.validateProductFeatureE(productFeatureValidationDto);
    if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
        return response;
    }
    response = this.validateProductFeatureF(productFeatureValidationDto);
    if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
        return response;
    }
    return getResponseOnValidationSuccess(productFeatureValidationDto);
}

提前感谢。

如果您可以使用spring框架。
首先,您可以定义这样的接口

公共接口验证产品{
ValidateProductFeatureResponse validate(ProductFeatureValidationDto);
}
您的特定验证类实现此接口并注册到srpingcontext

public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(ProductFeatureValidationDto到ProductFeatureValidationDto)抛出
ApplicationException,ParseException{
验证ProductFeatureResponse响应;
Map beansOfType=applicationContext.getBeansOfType(ValidateProduct.class);
for(ValidateProduct值:beansOfType.values()){
响应=value.validate(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name()){
返回响应;
}
}
返回getResponseOnValidationSuccess(productFeatureValidationDto);
}

我建议采用以下方法(示意图):

/**
*验证函数列表
*/
私有最终静态列表验证=新建LinkedList();
/**
*填写验证列表
*/
静止的{
验证。添加((源)->{
//特性A的测试
返回源;
});
验证。添加((源)->{
//特性B的测试
返回源;
});
验证。添加((源)->{
//特性C的测试
返回源;
});
}
/**
*失效判定谓词
*/
私有最终谓词是_FAILURE=(dto)->
dto.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name());
/**
*验证方法
*/
公共ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(
ProductFeatureValidationDto到dto
)引发ApplicationException,ParseException{
//迭代验证函数并在dto实例上调用它们
//按失败的验证筛选流
//第一场比赛就停下来
可选的dtoOptional=VALIDATIONS.stream()
.map(操作->操作.apply(dto))
.过滤器(IS_故障)
.findFirst();
//根据结果应用fuilure/success映射
返回dtoOptional.isPresent()
?getResponseOnValidationFailure(dto)
:getResponseOnValidationSuccess(dto);
}

我最终根据@Eiden和@Alexandra Dudkina给出的答案编写了我的解决方案。对他们大喊一声。下面是我整个解决方案的关键

所以,我有两个接口

  • ipProductFeature
    :这是一个功能界面,只有一种方法
    验证
    。每个约束都需要实现这一点
  • ipProductValidationService
    :这是一份合同,规定了需要实现的核心方法。方法
    验证ProductFeatureAgaInstallCriteria
    是合同的一部分
  • 有一个配置文件,其中所有功能都已导入,并根据不同类型产品的需要组织到列表中。此列表保存在地图中,产品类型为键。这就像一个工厂,根据给定的产品类型给出一个约束列表

    实现
    ipProductValidationService
    的具体类从配置中获取列表,然后将列表中的所有约束应用于给定的dto。 通过这种方式,我将所有关注点分为不同的部分。 这种方法的实际优势是:

    • 您可以为各个特性编写广泛的测试用例和文档
    • 如果将来,
      ProductFeatureB
      中有策略更改(例如),我所要做的就是创建一个新的具体类,将其命名为ProductFeatureBV2并仅更改配置文件。策略更改可以作为类javadoc的一部分进行记录。这样,在不改变核心验证方法的情况下,我可以不推荐
      ProductFeatureB
      。这使得代码非常灵活

    非常感谢社区帮助我做到这一点。如果这里有进一步的改进,请提出建议。

    使用interface@deadshot,我对功能界面不是很熟悉。你能为我提供一个小线索吗?这会有很大帮助,这很有意义,但当这些方法永远不会在方法之外使用时,似乎做得太多了#validateProductFeatureAgainstAllCriteria。这看起来像我正在寻找的方法。非常感谢。
        /**
         * List of validation functions
         */
        private final static List<Function<ProductFeatureValidationDto, ProductFeatureValidationDto>> VALIDATIONS = new LinkedList<>();
    
        /**
         * Fill validations list
         */
        static {
            VALIDATIONS.add((source) -> {
                // test for feature A
                return source;
            });
            VALIDATIONS.add((source) -> {
                // test for feature B
                return source;
            });
            VALIDATIONS.add((source) -> {
                // test for feature C
                return source;
            });
        }
        
        /**
         * Predicate for failure determination
         */
        private final Predicate<ProductFeatureValidationDto> IS_FAILURE = (dto) ->
                dto.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name());
    
        /**
         * Validation method
         */
        public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(
                ProductFeatureValidationDto dto
        ) throws ApplicationException, ParseException {
            
            // iterate over validation functions and invoke them on dto instance
            // filter stream by failed validations
            // stop on first match
            Optional<ProductFeatureValidationDto> dtoOptional = VALIDATIONS.stream()
                    .map(action -> action.apply(dto))
                    .filter(IS_FAILURE)
                    .findFirst();
            
            // apply fuilure / success maping depending on result
            return dtoOptional.isPresent()
                    ? getResponseOnValidationFailure(dto)
                    : getResponseOnValidationSuccess(dto);
        }