Java代码错误修正:检查图书元数据类型是否匹配指定值
问题分析与代码修复
首先,你遇到的报错Cannot invoke equalsIgnoreCase(String) on the primitive type boolean原因很明确:data.getMetaDataTypeName().equalsIgnoreCase("BOOK")已经返回一个布尔值(primitive boolean),而布尔基本类型根本没有equalsIgnoreCase方法,你试图链式调用这个方法的写法完全错误,这就是问题的核心。
结合你提到的“遍历列表中的每个对象,按照BOOK、FORMAT、LANGUAGE的层级进行条件检查”的需求,我分两种常见场景给出解决方案:
场景1:筛选所有符合BOOK/FORMAT/LANGUAGE的实体
如果你的需求是把列表中所有MetaDataTypeName属于这三个值的实体都筛选出来,推荐这种简洁易维护的写法:
// 先定义目标类型集合,后续修改只需调整集合内容 Set<String> targetMetaTypes = Set.of("BOOK", "FORMAT", "LANGUAGE"); List<MetaDataTypeEntity> matchedEntities = CollectionUtils.emptyIfNull(getMetaDataTypes()) .stream() // 增加null判断避免空指针,同时统一转大写匹配 .filter(data -> data.getMetaDataTypeName() != null && targetMetaTypes.contains(data.getMetaDataTypeName().toUpperCase())) .collect(Collectors.toList());
优点:把目标类型集中管理,后续新增/修改类型只需调整Set,无需修改过滤逻辑,同时通过统一转大写避免大小写敏感问题。
场景2:按层级优先匹配(BOOK > FORMAT > LANGUAGE)
如果你的“层级检查”是指优先获取第一个出现的BOOK类型实体,若没有则找第一个FORMAT,再没有则找LANGUAGE,可以通过排序实现优先级:
MetaDataTypeEntity priorityMatch = CollectionUtils.emptyIfNull(getMetaDataTypes()) .stream() // 先筛选出符合三个类型的实体,同时处理null情况 .filter(data -> data.getMetaDataTypeName() != null) .filter(data -> { String typeName = data.getMetaDataTypeName().toUpperCase(); return "BOOK".equals(typeName) || "FORMAT".equals(typeName) || "LANGUAGE".equals(typeName); }) // 按照BOOK(最高优先级) > FORMAT > LANGUAGE的顺序排序 .sorted((entityA, entityB) -> { String typeA = entityA.getMetaDataTypeName().toUpperCase(); String typeB = entityB.getMetaDataTypeName().toUpperCase(); // 为每个类型分配优先级数值,数值越小优先级越高 int priorityA = switch(typeA) { case "BOOK" -> 0; case "FORMAT" -> 1; case "LANGUAGE" -> 2; default -> 3; }; int priorityB = switch(typeB) { case "BOOK" -> 0; case "FORMAT" -> 1; case "LANGUAGE" -> 2; default -> 3; }; return Integer.compare(priorityA, priorityB); }) // 取优先级最高的第一个实体 .findFirst() .orElse(null);
这个写法会先过滤出符合条件的实体,再按照你要求的层级排序,最后返回优先级最高的那个实体,完全匹配“层级检查”的需求。
内容的提问来源于stack exchange,提问作者kesav
相关产品推荐
相关产品推荐

