如何用switch语句替代if-else处理文本行开头标识判断
嘿,这个需求我太熟了!你想把那串繁琐的if-else改成switch语句,其实分Java版本有不同的实现方式,我给你一步步讲清楚:
方案一:Java 7及以上(支持字符串Switch)
Java 7开始允许在switch中使用字符串,所以我们可以先把每行的前缀提取出来,再用switch匹配。因为你的前缀有两种长度(单个字符O/B、两个字符30/99/00),得先统一提取:
while((line = inputStream.readLine()) != null) { if (line.isEmpty()) { // 处理空行,直接跳过 continue; } String prefix; char firstChar = line.charAt(0); if (firstChar == 'O' || firstChar == 'B') { // 单个字符前缀,直接取第一个字符 prefix = String.valueOf(firstChar); } else if (Character.isDigit(firstChar)) { // 数字开头的取前两位,注意要判断行长度够不够 prefix = line.length() >= 2 ? line.substring(0, 2) : line; } else { // 其他开头的行,直接跳过或做对应处理 continue; } // 现在用switch匹配前缀 switch(prefix) { case "O": // 原来O开头的业务逻辑 System.out.println("处理O开头的行"); break; case "B": // 原来B开头的业务逻辑 System.out.println("处理B开头的行"); break; case "30": // 原来30开头的业务逻辑 System.out.println("处理30开头的行"); break; case "99": // 原来99开头的业务逻辑 System.out.println("处理99开头的行"); break; case "00": // 原来00开头的业务逻辑 System.out.println("处理00开头的行"); break; default: // 处理其他未匹配到的前缀 System.out.println("未知前缀的行"); break; } }
方案二:Java 12及以上(更简洁的Switch表达式)
如果你的项目用的是Java 12或更高版本,推荐用Switch表达式,支持带条件的case(用when关键字),甚至不用提前提取前缀,直接在case里判断startsWith,代码更紧凑:
while((line = inputStream.readLine()) != null) { switch(line) { case String l when l.startsWith("O") -> { // O开头的业务逻辑 System.out.println("处理O开头的行"); } case String l when l.startsWith("B") -> { // B开头的业务逻辑 System.out.println("处理B开头的行"); } case String l when l.startsWith("30") -> { // 30开头的业务逻辑 System.out.println("处理30开头的行"); } case String l when l.startsWith("99") -> { // 99开头的业务逻辑 System.out.println("处理99开头的行"); } case String l when l.startsWith("00") -> { // 00开头的业务逻辑 System.out.println("处理00开头的行"); } default -> { // 其他情况的处理 System.out.println("未知格式的行"); } } }
这种写法不用额外处理前缀提取,直接在case里做条件判断,逻辑更直观,而且不用写break(箭头语法自动终止当前case),减少了代码冗余。
几个注意点
- 一定要处理空行或者行长度不足的情况,避免
charAt(0)或substring抛出StringIndexOutOfBoundsException - 如果后续要新增更多前缀,
switch比if-else结构更清晰,扩展性更好 - 要是你还在使用Java 6及更早版本(现在很少见了),可以把前缀映射成枚举或整数,再用
switch匹配
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

