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(需根据业务需求处理边界情况)

原始标题:How to Check if All Map Values Are the Same | Baeldung