You need to enable JavaScript to run this app. Java 8如何不使用多重if else/switch实现条件设置变量值
优惠活动
大模型
产品
解决方案
定价
更多

Java 8如何不使用多重if else/switch实现条件设置变量值

Java 8 替代多重if-else的实现方案

针对你提到的字符串匹配赋值场景,Java 8下有两种更易维护、可读性更高的实现方式,比多重if-else或传统switch更优:

方案1:不可变Map映射(最简洁,适合简单赋值场景)

提前把匹配规则存到不可变Map中,查询效率为O(1),规则修改不需要改动业务逻辑:

import java.util.Map;

// 全局预初始化映射关系,程序启动时只会初始化一次
// 如果RequestNumber是字符串类型,把Map泛型改为Map<String, String>,对应值改为"123"、"000"即可
private static final Map<String, Integer> REQUEST_NUM_MAPPING = Map.of(
        "foo", 123,
        "bar", 123,
        "xyz", 456
);

// 业务逻辑处直接调用
int requestNum = REQUEST_NUM_MAPPING.getOrDefault(someString.toLowerCase(), 0);
x = someObj.setRequestNumber(requestNum);

方案2:枚举类封装(适合规则复杂、后续可能扩展逻辑的场景)

如果后续匹配规则可能附带其他操作,用枚举把匹配逻辑和对应值封装在一起,可维护性更强:

import java.util.Arrays;
import java.util.List;

public enum RequestNumEnum {
    TYPE_FOO_BAR(123, "foo", "bar"),
    TYPE_XYZ(456, "xyz"),
    TYPE_DEFAULT(0);

    private final int requestNum;
    private final List<String> matchKeys;

    RequestNumEnum(int requestNum, String... matchKeys) {
        this.requestNum = requestNum;
        this.matchKeys = Arrays.asList(matchKeys);
    }

    public static int getRequestNum(String input) {
        String lowerInput = input.toLowerCase();
        return Arrays.stream(values())
                .filter(item -> item.matchKeys.contains(lowerInput))
                .findFirst()
                .orElse(TYPE_DEFAULT)
                .getRequestNum();
    }

    public int getRequestNum() {
        return requestNum;
    }
}

// 业务逻辑调用
x = someObj.setRequestNumber(RequestNumEnum.getRequestNum(someString));

两种方案的优势

  • 规则与业务逻辑完全解耦,新增/修改匹配规则只需要调整Map或枚举的定义,不需要修改业务执行代码
  • 所有映射规则一目了然,可读性远高于嵌套的if-else
  • 匹配效率更高,规则越多的场景下,比多重if-else的线性查询优势越明显

内容的提问来源于stack exchange,提问作者Gitesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 04:39:04