如何用Java Stream验证列表值是否全部存在于指定枚举类中
用Java Stream验证列表元素是否均属于指定枚举类
实现思路
核心是利用Stream的allMatch方法,结合枚举值的预存集合或枚举类自身封装的验证逻辑,快速判断列表中所有元素是否都存在于枚举的有效值范围内。
方案一:预存枚举有效值到Set(高效版)
先将枚举的所有value提取到Set中(查找效率为O(1)),再通过allMatch验证列表元素是否全部属于该集合:
import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class ServiceValidator { public static boolean validateServices(List<String> serviceList) { // 预缓存枚举的所有有效值到Set,避免每次验证都遍历枚举实例 Set<String> validServiceValues = Arrays.stream(Service.values()) .map(Service::getValue) .collect(Collectors.toSet()); // 验证列表所有元素都在有效值集合内,只要有一个不满足就返回false return serviceList != null && serviceList.stream() .allMatch(validServiceValues::contains); } public static void main(String[] args) { List<String> listOfService = Arrays.asList("mobile_postpaid", "mobile_internet", "sam"); System.out.println(validateServices(listOfService)); // 输出false } }
方案二:枚举类内封装验证逻辑(更符合OOP)
在Service枚举中添加静态方法,封装“判断字符串是否为有效枚举值”的逻辑,再通过Stream调用该方法:
首先修改枚举类:
package org.tmve.customer.ms.beans.response; import lombok.Getter; import java.util.Arrays; @Getter public enum Service { MOBILE_PREPAID("mobile_prepaid"), MOBILE_POSTPAID("mobile_postpaid"), VALUE_ADDED_SERVICE("value_added_service"), MOBILE_INTERNET("mobile_internet"), DTH("dth"), LANDLINE("landline"), AUTHENTICATION("authentication"); private String value; Service(String value) { this.value = value; } // 静态方法:判断输入字符串是否为有效枚举值 public static boolean isValidService(String serviceValue) { return Arrays.stream(values()) .anyMatch(service -> service.getValue().equals(serviceValue)); } }
然后验证方法可简化为:
import java.util.Arrays; import java.util.List; public class ServiceValidator { public static boolean validateServices(List<String> serviceList) { return serviceList != null && serviceList.stream() .allMatch(Service::isValidService); } public static void main(String[] args) { List<String> listOfService = Arrays.asList("mobile_postpaid", "mobile_internet", "sam"); System.out.println(validateServices(listOfService)); // 输出false } }
关键说明
allMatch特性:遇到第一个不满足条件的元素时会立即终止遍历(短路求值),性能高效。- 空列表处理:如果允许空列表返回
true,保持现有逻辑即可;若需空列表返回false,可在方法开头添加if (serviceList == null || serviceList.isEmpty()) return false;。
内容的提问来源于stack exchange,提问作者Cesar Justo
相关产品推荐
相关产品推荐

