如何更简洁地比较String数组与ArrayList<String>?
更优雅的序列匹配实现方案
你的代码思路没问题,但确实可以简化,而且原代码存在一个潜在bug:没有先校验两个序列的长度是否一致。如果sequence的长度和properSequence不相等,要么会抛出ArrayIndexOutOfBoundsException(当sequence更长时),要么会错误地判定为匹配(当properSequence更长时,原代码会忽略多出来的元素)。
下面给你几种更简洁、健壮的实现方式:
方案1:Java 8+ 原生流实现(无额外依赖)
利用IntStream遍历索引,同时完成长度校验和元素匹配,代码紧凑且可读性强:
String[] properSequence = ability.getSequence(); boolean matchesSequence = sequence.size() == properSequence.length && IntStream.range(0, sequence.size()) .allMatch(i -> properSequence[i].equalsIgnoreCase(sequence.get(i)));
方案2:借助Apache Commons Collections(需引入依赖)
如果项目里已经使用Apache Commons工具包,可以用语义化的方式实现忽略大小写的顺序匹配:
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Equator; // ... String[] properSequence = ability.getSequence(); boolean matchesSequence = CollectionUtils.isEqualList( sequence, Arrays.asList(properSequence), (s1, s2) -> s1.equalsIgnoreCase(s2) );
方案3:简化原生循环(最基础的优化)
如果不想用流或第三方库,也可以给原代码做轻量化优化,补上长度校验并精简循环逻辑:
String[] properSequence = ability.getSequence(); boolean matchesSequence = sequence.size() == properSequence.length; for (int i = 0; matchesSequence && i < sequence.size(); i++) { if (!properSequence[i].equalsIgnoreCase(sequence.get(i))) { matchesSequence = false; } }
把长度判断放在开头,循环条件里加入matchesSequence,一旦不匹配就提前终止,比原代码更紧凑。
不管选哪种方案,长度校验都是必不可少的,这能避免很多潜在的错误~
内容的提问来源于stack exchange,提问作者John White
相关产品推荐
相关产品推荐

