Java如何检查对象是否存在于值为Optional<Object>的Map中
问题根因
- 你遇到的返回false问题确实是Map值类型差异导致的:
pojoMappedByName的值类型是Optional<PojoClass>,而你调用containsValue时传入的是PojoClass类型的实例,两种完全不同类型的对象做equals判断会直接返回false,不符合预期。 - 额外提醒:就算你将
pojotest包装为Optional后再调用containsValue,也需要确保PojoClass已经正确重写了equals()和hashCode()方法,否则两个属性完全一致但内存地址不同的PojoClass实例也会被判定为不相等。
无循环实现方案
你可以直接使用Stream API实现需求,不需要手动写for循环:
适配Java 8+的通用写法
boolean containsTarget = pojoMappedByName.values() .stream() .filter(Optional::isPresent) .map(Optional::get) .anyMatch(pojotest::equals);
适配Java 9+的简化写法
借助Java 9新增的Optional.stream()方法可以进一步简化代码:
boolean containsTarget = pojoMappedByName.values() .stream() .flatMap(Optional::stream) .anyMatch(pojotest::equals);
最简写法(业务允许时使用)
如果你的业务逻辑不需要特殊处理空Optional的场景,也可以直接将目标对象包装为Optional后调用原生containsValue方法:
boolean containsTarget = pojoMappedByName.containsValue(Optional.ofNullable(pojotest));
内容的提问来源于stack exchange,提问作者CookieMonster
相关产品推荐
相关产品推荐

