Java中判断值是否在列表内 替代多if条件判断的方案有哪些
Java 判断变量是否存在于指定列表的替代实现方案
方案1:List.contains() 实现(Java 7及更早版本兼容)
适合校验值数量少、调用频率低的场景,直接用Arrays.asList构建固定列表调用contains方法即可:
// 固定校验列表建议定义为静态常量,避免重复创建对象 private static final List<String> TARGET_VALUES = Arrays.asList("a", "b", "c", "d", "e"); // 调用前先判空,避免空指针异常,和原有写法的异常行为一致 if (x != null && TARGET_VALUES.contains(x)) { // 原有业务逻辑 }
注意:
Arrays.asList生成的是定长列表,不支持增删操作,刚好适配固定校验场景,如果需要可变列表可外层包裹new ArrayList<>(Arrays.asList(...))。
方案2:Set.contains() 实现(高性能场景首选)
如果校验值数量多、判断逻辑调用频率高,推荐用HashSet存储校验值,contains操作时间复杂度为O(1),性能远高于List的O(n):
private static final Set<String> TARGET_VALUES = new HashSet<>(Arrays.asList("a", "b", "c", "d", "e")); if (x != null && TARGET_VALUES.contains(x)) { // 原有业务逻辑 }
方案3:Stream流式写法(Java 8+ 适用,无需提前定义常量)
如果是单次临时校验不想单独定义常量,可以用Stream的anyMatch方法实现:
if (x != null && Stream.of("a", "b", "c", "d", "e").anyMatch(x::equals)) { // 原有业务逻辑 }
方案4:集合工厂方法实现(Java 9+ 适用,写法更简洁)
Java 9之后原生支持List.of、Set.of静态工厂方法,创建不可变固定集合的语法更简洁:
private static final Set<String> TARGET_VALUES = Set.of("a", "b", "c", "d", "e"); if (x != null && TARGET_VALUES.contains(x)) { // 原有业务逻辑 }
补充说明
- 如果业务允许x为null且需要把null纳入校验范围,去掉非空判断、把null加入校验集合即可。
- 如果校验值数量在3个以内,原有逐个equals的写法性能更高,不需要额外创建集合对象,可根据实际场景选择。
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

