解析内容 if else太多 请问优化代码?-灵析社区

爬虫爬呀爬

//List 内容 [ti:我本闺中一钗裙] [oti:我本闺中一钗裙] [jz:黄梅戏] [jm:女驸马] [ojm:女驸马] [offset:-1] [by:制作者] [ver:驸马公主合唱] [keys:民女,洞房] [00:04.99](驸马):我本闺中一钗裙 [00:31.93](公主白):此话当真 [00:34.19](驸马):公主请看耳环痕 [00:59.33] /** * 解析唱段内容 * * @param changDuan 唱段对象 * @param line 当前需要解析的内容 即上面 List 每一行内容 * @param patternMap 唱段正则表达式 可以正则匹配上面 List 内容 * @throws ParseLrcException */ private static void parseLrcContent(ChangDuan changDuan, String line, Map patternMap) throws ParseLrcException { if (matcher(line, patternMap, LrcConstants.LrcRegEnum.TITLE.name())) { changDuan.setName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.TITLE.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.ORIGIN_TITLE.name())) { changDuan.setOriginName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.ORIGIN_TITLE.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.JUMU.name())) { changDuan.setJuMu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.JUMU.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.ORIGIN_JUMU.name())) { changDuan.setOriginJuMu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.ORIGIN_JUMU.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.OFFSET_REG.name())) { changDuan.setOffset(Integer.parseInt(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.OFFSET_REG.getStartIndex()))); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.JU_ZHONG.name())) { changDuan.setJuZhong(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.JU_ZHONG.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.BEIZHU.name())) { changDuan.setBeiZhu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.BEIZHU.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.VERSION.name())) { changDuan.setVersion(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.VERSION.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.KEYS.name())) { changDuan.setSearchKeys(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.KEYS.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.BY.name())) { changDuan.setMaker(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.BY.getStartIndex())); } else { throw new ParseLrcLineException(line); } } 上段代码是用于将List解析成ChangDuan 想请教一下这个代码写的咋样,能否优化,我就是觉得if else太多了。

阅读量:15

点赞量:0

问AI
抽象一个接口: interface IMatchParser{ boolean matcher(String line, Map map); handle(ChangDuan changduan); } 每个if分支抽象成一个类继承"IMatchParser"; public class MatchParser1 implements IMatchParser{ public void handle(ChangDuan changduan) { changDuan.setName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.TITLE.getStartIndex())); } public boolean matcher(String line, Map map) { return matcher(line, patternMap, LrcConstants.LrcRegEnum.TITLE.name()); } } 然后放到一个list中: List list = new ArrayList(); list.add(new MatchParser1()); list.add(new MatchParser2()); ... 然后实现方法变成: private static void parseLrcContent(ChangDuan changDuan, String line, Map patternMap) throws ParseLrcException { for (IMatchParser parser: list) { if (parser.match(line, patternMap)) { parser.handle(changDuan); break; } } } 后续加新的if分支只需要实现一个新的class插入到list即可