1. 引言
本文将探讨多种检查Java Map中所有值是否相同的方法。我们将分析传统循环和Stream API等实现方式,评估它们的效率和可读性。
通过实际示例,我们将深入了解如何为应用选择最有效的解决方案。
2. 检查Map中所有值是否相同
我们将分析四种主要策略,每种策略采用不同技术验证Map中的值是否全部相同。每种策略都有其优缺点,下面详细讨论。
先创建一个贯穿所有策略的简单Map对象:
Map<String, Integer> map = Map.of("English", 100, "Maths", 100, "Science", 100);
2.1. 使用Stream的allMatch()方法
Java 8 Stream API中的allMatch()方法用于检查集合中所有元素是否满足指定条件。在我们的场景中,它验证所有值是否等于集合中的第一个值:
boolean areAllValuesSameWithAllMatch(Map<String, Integer> map) {
int firstValue = map.values().iterator().next();
return map.values().stream().allMatch(value -> value.equals(firstValue));
}
这里我们先获取Map的第一个值,然后用allMatch()验证每个值是否匹配该firstValue。如果所有值相同则返回true,否则一旦发现不同值立即终止检查。
2.2. 使用Set检查唯一值
通过将所有值存入HashSet,我们利用Set自动去重的特性:
boolean areAllValuesSameWithSet(Map<String, Integer> map) {
Set<Integer> uniqueValues = new HashSet<>(map.values());
return uniqueValues.size() == 1;
}
我们将Map中的所有值存入HashSet,该集合会自动过滤重复值。最后检查HashSet的大小:若为1则所有值相同;若大于1则Map中存在不同值。
2.3. 使用Stream.reduce()与Boolean.logicalAnd
此方法中,我们使用Java Streams的reduce()函数,通过逻辑AND操作比较每个值与第一个值。如果偏好函数式编程风格且不需要提前终止,此方法很适用:
boolean areAllValuesSameWithReduce(Map<String, Integer> map) {
int firstValue = map.values().iterator().next();
return map.values().stream().reduce(true,
(result, value) -> result && value.equals(firstValue),
Boolean::logicalAnd);
}
✅ 优点:
- 代码简洁,符合函数式编程风格
- 适合处理大型数据集(但无提前终止优化)
⚠️ 注意:
- 与allMatch()不同,此方法会遍历整个流
- 对于空Map会返回true(需根据业务需求处理边界情况)