You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java时间转换程序:如何用switch替代庞大的if-else块?

用Switch替代繁琐If-Else的时间转换方案

嘿,作为Java新手能写出功能完整的时间转换程序已经超棒啦!你提到的用switch替代冗长if-else的需求很合理,咱们一步步来实现:

核心思路:利用字符串Switch拼接单位组合

从Java 7开始,switch就支持字符串类型了。我们可以把fromUnit和toUnit拼接成一个唯一的标识(比如fromUnit + "_" + toUnit),这样每个转换组合就对应一个case,代码结构会清晰很多。

另外,原代码里的打印逻辑重复度很高,咱们先把这部分提取成工具方法,减少冗余代码:

private static void printConversionResult(double result, long userNumber, String fromUnit, String toUnit) {
    // 处理单复数
    String fromUnitLabel = userNumber == 1 ? fromUnit : getPluralUnit(fromUnit);
    // 根据目标单位调整小数位数(可按需调整)
    String formatPattern;
    if (toUnit.equals("ms")) {
        formatPattern = "\nThere are %,.3f %s in %,d %s.\n";
    } else if (toUnit.equals("w") || toUnit.equals("d") || toUnit.equals("h")) {
        formatPattern = "\nThere are %,.3f %s in %,d %s.\n";
    } else {
        formatPattern = "There are %,.2f %s in %,d %s.\n";
    }
    System.out.printf(formatPattern, result, getFullUnitName(toUnit), userNumber, fromUnitLabel);
}

// 辅助方法:获取单位的复数形式
private static String getPluralUnit(String unit) {
    return switch (unit) {
        case "w" -> "weeks";
        case "d" -> "days";
        case "h" -> "hours";
        case "m" -> "minutes";
        case "s" -> "seconds";
        case "ms" -> "microseconds";
        default -> unit + "s";
    };
}

// 辅助方法:获取单位的完整名称(用于打印)
private static String getFullUnitName(String unit) {
    return switch (unit) {
        case "w" -> "weeks";
        case "d" -> "days";
        case "h" -> "hours";
        case "m" -> "minutes";
        case "s" -> "seconds";
        case "ms" -> "microseconds";
        default -> unit;
    };
}

替换后的Switch代码

现在用switch替代原有的if-else块,代码结构会清爽很多:

// 拼接单位组合作为switch的判断条件
String conversionKey = fromUnit + "_" + toUnit;
double results = 0;

switch (conversionKey) {
    case "w_s" -> {
        results = userNumber * SECONDS_PER_WEEK;
        printConversionResult(results, userNumber, "week", "seconds");
    }
    case "h_s" -> {
        results = userNumber * SECONDS_PER_HOUR;
        printConversionResult(results, userNumber, "hour", "seconds");
    }
    case "d_s" -> {
        results = userNumber * SECONDS_PER_DAY;
        printConversionResult(results, userNumber, "day", "seconds");
    }
    case "m_s" -> {
        results = userNumber * SECONDS_PER_MINUTE;
        printConversionResult(results, userNumber, "minute", "seconds");
    }
    case "s_s" -> {
        results = userNumber * SECONDS_PER_SECOND;
        System.out.printf("There are %,.2f seconds per second.\n", results);
    }
    case "w_m" -> {
        results = userNumber * MINUTES_PER_WEEK;
        printConversionResult(results, userNumber, "week", "minutes");
    }
    case "d_m" -> {
        results = userNumber * MINUTES_PER_DAY;
        printConversionResult(results, userNumber, "day", "minutes");
    }
    case "h_m" -> {
        results = userNumber * MINUTES_PER_HOUR;
        printConversionResult(results, userNumber, "hour", "minutes");
    }
    case "m_m" -> {
        results = userNumber * MINUTES_PER_MINUTE;
        printConversionResult(results, userNumber, "minute", "minutes");
    }
    case "h_h" -> {
        results = userNumber * HOURS_PER_HOUR;
        printConversionResult(results, userNumber, "hour", "hours");
    }
    case "d_h" -> {
        results = userNumber * HOURS_PER_DAY;
        printConversionResult(results, userNumber, "day", "hours");
    }
    case "w_h" -> {
        results = userNumber * HOURS_PER_WEEK;
        printConversionResult(results, userNumber, "week", "hours");
    }
    case "d_d" -> {
        results = userNumber * DAYS_PER_DAY;
        printConversionResult(results, userNumber, "day", "days");
    }
    case "w_d" -> {
        results = userNumber * DAYS_PER_WEEK;
        printConversionResult(results, userNumber, "week", "days");
    }
    case "s_ms" -> {
        results = userNumber * MICROSECONDS_PER_SECOND;
        printConversionResult(results, userNumber, "second", "microseconds");
    }
    case "d_w" -> {
        results = userNumber * WEEKS_PER_DAY;
        printConversionResult(results, userNumber, "day", "weeks");
    }
    case "h_d" -> {
        results = userNumber * DAYS_PER_HOUR;
        printConversionResult(results, userNumber, "hour", "days");
    }
    case "s_h" -> {
        results = userNumber * HOURS_PER_MINUTE * MINUTES_PER_SECOND;
        printConversionResult(results, userNumber, "second", "hours");
    }
    case "ms_s" -> {
        results = userNumber * SECONDS_PER_MICROSECOND;
        printConversionResult(results, userNumber, "microsecond", "seconds");
    }
    case "m_ms" -> {
        results = userNumber * MICROSECONDS_PER_MINUTE;
        printConversionResult(results, userNumber, "minute", "microseconds");
    }
    case "h_ms" -> {
        results = userNumber * MICROSECONDS_PER_HOUR;
        printConversionResult(results, userNumber, "hour", "microseconds");
    }
    // 处理未知的转换组合
    default -> System.out.println("抱歉,不支持当前的单位转换组合!");
}

额外优化建议

如果之后需要新增更多单位,switch还是会慢慢变长,你可以考虑:

  • 用枚举定义每个时间单位,包含它到基准单位(比如秒)的转换系数
  • 用Map<String, Double>存储所有转换组合的系数,直接通过conversionKey获取系数,代码会更简洁

不过目前用switch已经能很好解决你当前的代码冗余问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:46:15