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
相关产品推荐
相关产品推荐

