【问题标题】:Create a method for return set of Predicates创建返回谓词集的方法
【发布时间】:2021-07-07 07:45:48
【问题描述】:

我创建了 3 个谓词,它们在这个 Service 类的一个方法中使用。这些是目前在一种方法中的 3 个谓词。但是在实施这个项目时,这些谓词似乎也可用于其他服务方法。

因此,有什么方法可以将它们放入一个单独的方法中,并在我们想要获取这些谓词时调用该方法? Predicate 的类型也需要改变。为此,我可以使用像Predicate<T> 这样的泛型吗?

Predicate<LocalRequestDTO> allFilter = request -> (!StringUtils.isBlank(request.getSuvc())
        && !StringUtils.isBlank(request.getSuffix()) && !StringUtils.isBlank(request.getSite()));
Predicate<LocalRequestDTO> suvcSuffixFilter = request -> (!StringUtils.isBlank(request.getSuvc())
        && !StringUtils.isBlank(request.getSuffix()) && StringUtils.isBlank(request.getSite()));
Predicate<LocalRequestDTO> suvcFilter = request -> (!StringUtils.isBlank(request.getSuvc())
        && StringUtils.isBlank(request.getSuffix()) && StringUtils.isBlank(request.getSite()));

【问题讨论】:

    标签: java spring-boot predicate


    【解决方案1】:

    一种选择是创建一个返回Predicate的方法:

    private static Predicate<LocalRequestDTO> allFilter() {
        return request -> (!StringUtils.isBlank(request.getSuvc()) &&
                !StringUtils.isBlank(request.getSuffix()) &&
                !StringUtils.isBlank(request.getSite()));
    }
    
    List<LocalRequestDTO> allDto = dtos.stream()
            .filter(allFilter())
            .collect(Collectors.toList());
    

    另一种选择是将Predicate 定义为常量:

    private static final Predicate<LocalRequestDTO> SUVC_FILTER = request ->
            (!StringUtils.isBlank(request.getSuvc()) &&
                    StringUtils.isBlank(request.getSuffix()) &&
                    StringUtils.isBlank(request.getSite()));
    
    List<LocalRequestDTO> suvcDto = dtos.stream()
            .filter(SUVC_FILTER)
            .collect(Collectors.toList());
    

    或者您可以创建一个接受 DTO 并返回布尔值的方法,而不使用 @Lino 建议的谓词:

    private static boolean doSuvcFilter(LocalRequestDTO request) {
        return !StringUtils.isBlank(request.getSuvc()) && 
                StringUtils.isBlank(request.getSuffix()) && 
                StringUtils.isBlank(request.getSite());
    }
    
    List<LocalRequestDTO> suvcDto = dtos.stream()
            .filter(ClassNameContainingMethod::doSuvcFilter)
            .collect(Collectors.toList());
    

    【讨论】:

    • 我们不能为所有 3 个谓词创建一个方法,而不是为它们创建每个方法吗?因为在我的问题中有超过 3 个谓词。
    • @Gayath_chandi 创建多个方法没有错。不知何故,您需要将不同的谓词分开。在使用枚举或 switch 语句(作为参数)的一种方法中执行此操作只会使维护 IMO 变得更加复杂和困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多