当前位置: 首页 > 知识库问答 >
问题:

在java中简化众多if, elseifs[重复]

顾光明
2023-03-14

我在这里寻求帮助w.rt.简化java中的if-elseif语句。这是我下面的代码,其中有许多if,elseifs。是否可以使用java lambda功能简化下面的代码?我可以在我的方法中减少if,elseif语句吗?我们可以在这里使用Java8过滤功能吗?

public ReturnsRetailerConfigPromotionResponse promoteRetailerConfig(
        ReturnsRetailerConfigPromotionRequest returnsRetailerConfigPromotionRequest,
        String configType) {
        try{
            if(isTenantConfigPromotion){
                tenantDetails = returnsGenericUtils.getTenantConfig(sourceRetailerName, sourceHubLoginResponse);
            }
            else if(isTrackConfigPromotion){
                returnsGenericUtils.downloadTrackConfig(sourceRetailerName, sourceHubcookies);
            }
            else if(isReturnRulesPromotion){
                returnsGenericUtils.downloadReturnRules(sourceRetailerName, sourceHubcookies);
            }
            else if(isReturnReasonsPromotion){
                returnsGenericUtils.downloadReturnReasons(sourceRetailerName, sourceHubcookies);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return new ReturnsRetailerConfigPromotionResponse(...);
        }
}

共有1个答案

彭鹭洋
2023-03-14

首先,如果唯一的“真”情况是可能的,我会删除多余的“else if”语句,如下所示:

            if(isTenantConfigPromotion){
                tenantDetails = returnsGenericUtils.getTenantConfig(sourceRetailerName, sourceHubLoginResponse);
            }
            if(isTrackConfigPromotion){
                returnsGenericUtils.downloadTrackConfig(sourceRetailerName, sourceHubcookies);
            }
            if(isReturnRulesPromotion){
                returnsGenericUtils.downloadReturnRules(sourceRetailerName, sourceHubcookies);
            }
            if(isReturnReasonsPromotion){
                returnsGenericUtils.downloadReturnReasons(sourceRetailerName, sourceHubcookies);
            }

然后我会考虑把积木移到别的地方,因为‘这看起来像是一个副作用:

if(isTenantConfigPromotion){
  tenantDetails = ..
}

如果您真的想在这里使用lambdas,那么您可以尝试将布尔条件转换为文本值,并制作如下内容:

private static final Map<String, BiConsumer<Object, Object>> DOWNLOADERS_MAPPING = Map.of(
            "isTrackConfigPromotion", returnsGenericUtils::getTenantConfig,
            "isReturnRulesPromotion", returnsGenericUtils::downloadReturnRules,
            "isReturnReasonsPromotion", returnsGenericUtils::downloadReturnReasons
    );

public ReturnsRetailerConfigPromotionResponse promoteRetailerConfig(
            ReturnsRetailerConfigPromotionRequest returnsRetailerConfigPromotionRequest,
            String configType,
            Set<String> conditions
    ) {
        try {
            conditions.forEach(condition -> {
                DOWNLOADERS_MAPPING.getOrDefault(condition, returnsGenericUtils::doNothing).accept(sourceRetailerName, sourceHubcookies);
            });
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return new ReturnsRetailerConfigPromotionResponse(...);
        }
    }

如果你得到更多的条件,扩展方法会更容易。

 类似资料:
  • 我想我可以做一些 但结果是语法不正确

  • 我如何重构所有这些看起来重复和太长的代码,有没有办法让它变短? 我试过使用Switch语句,但在这种情况下不起作用。 “typeofdata”变量包含一个用于匹配相关行的字符串。

  • 我对laravel(特别是L5)相当陌生,我正在制作我自己版本的todo应用程序,而不是按照那里的某个教程去做。到目前为止,我已经学到了很多东西,但是我现在在刀片模板中展示的这段代码让我觉得它们可能是一种更简单的方法。 我的 fn是 扩展了一个 模型,使数据处理变得非常容易! 我的路线是: 所以我的页面只是显示了一个无序的“TODOS”列表。我想要两份单独的名单。一个用于完成的待办事项,一个用于未

  • 我想从数据集中删除多个列。这些列位于随机位置,我有它们的名称。目前,我删除它们如下。 有人能告诉我如何简化在更少代码行中删除列的过程吗。

  • 我在验证函数中有两个字符串变量,它应该确保变量不会同时为null或空(不允许一个为null,另一个等于空)。 当前的IF语句非常复杂,因为我必须检查: 如果两者都为空 它是功能性的,但丑陋,不是“最佳实践”。如何简化?

  • null 它是功能性的,但丑陋,不是“最佳实践”。怎么简化呢?