如何根据指定枚举类过滤String列表,保留匹配元素?
解决方案
首先修正枚举类的语法错误(原代码里class Enum Type是错误写法,正确的枚举定义是enum Type),同时给枚举类添加辅助方法,方便后续过滤操作:
enum Type { WIN("window"), DOOR("door"); private final String type; Type(String type) { this.type = type; } // 获取所有枚举对应的字符串值集合 public static Set<String> getAllValidTypes() { return Arrays.stream(Type.values()) .map(Type::getType) .collect(Collectors.toSet()); } public String getType() { return type; } }
接下来利用Java 8+的Stream API对String列表进行过滤:
import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class FilterDemo { public static void main(String[] args) { List<String> matType = Arrays.asList("window","door","room","kitchen","bedroom"); Set<String> validTypes = Type.getAllValidTypes(); // 过滤出仅匹配枚举值的元素 List<String> filteredList = matType.stream() .filter(validTypes::contains) .collect(Collectors.toList()); System.out.println(filteredList); // 输出: [window, door] } }
替代实现(无需提前生成集合)
如果不想额外生成Set集合,也可以直接在过滤逻辑中遍历枚举判断匹配:
List<String> filteredList = matType.stream() .filter(str -> Arrays.stream(Type.values()) .anyMatch(type -> type.getType().equals(str))) .collect(Collectors.toList());
注意细节
- 枚举的构造方法默认是私有,无需手动加
private修饰符 - 将枚举的
type字段设为final,避免被意外修改 - 使用Set存储枚举值的字符串形式,判断存在性的效率比每次遍历枚举更高(枚举值较多时更明显)
内容的提问来源于stack exchange,提问作者Google cloud
相关产品推荐
相关产品推荐

