如何檢查所有映射值是否相同
一、簡介
在本文中,我們將探討檢查 Java Map
中的所有值是否相同的各種方法.
我們將研究傳統循環和 Stream API 等方法,同時評估它們的有效性和可讀性。
實際範例將使我們深入了解如何為我們的應用選擇最有效的解決方案。
2. 檢查映射中的所有值是否相同
我們將回顧四個主要策略。每個都使用不同的技術來驗證映射中的所有值是否相同。每種策略都有優點和局限性,所以讓我們詳細討論每種策略。
讓我們建立一個簡單的地圖對象,我們將在整個策略中使用它:
Map<String, Boolean> map = Map.of("English", 100, "Maths", 100, "Science", 100);
2.1.將allMatch()
與流結合使用
allMatch()
方法是 Java 8 的 Stream API 的一部分,用於檢查集合中的所有元素是否符合指定的條件。在我們的例子中,它檢查映射中的所有值是否等於集合中的第一個值:
boolean areAllValuesSameWithAllMatch(Map<String, Integer> map) {
int firstValue = map.values().iterator().next();
return map.values().stream().allMatch(value -> value.equals(firstValue));
}
在這裡,我們從映射中取得第一個值,並使用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);
}
reduce()
方法將Boolean.logicalAnd()
套用至所有值。在這裡,我們評估每個元素,並透過將結果與 Boolean.logicAnd() 組合來將其減少為true
或false
值Boolean.logicalAnd().
2.4.使用傳統的for
循環
如果我們使用 Java 8 之前的版本或更喜歡傳統循環,那麼這種方法是理想的選擇。使用for-
循環檢查每個值是否相同的簡單方法:
boolean areAllValuesSameWithLoop(Map<String, Integer> map) {
int firstValue = map.values().iterator().next();
for (int value : map.values()) {
if (!value.equals(firstValue)) {
return false;
}
}
return true;
}
在這裡,我們檢索firstValue
並將其與映射中的每個值進行比較。然後循環遍歷每個值,如果偵測到不匹配,則退出循環並傳回false
。否則,循環一旦完成就回傳true
。
3. 效能比較
為了幫助我們選擇最合適的方法來檢查地圖中的所有值,我們總結了下表中的每種方法:
方法 | 短路 | 可讀性 | 相容性 | 效率 | 表現 |
---|---|---|---|---|---|
allMatch() |
是的 | 高的 | Java 8+ | 一旦發現false 立即停止 |
由於提前終止,最適合大型地圖 |
Set 的方法 |
不 | 高的 | Java 7 以下版本 | 對小Map 有效 |
由於需要額外的記憶體來創建Set ,因此對於大型地圖來說中等 |
使用Boolean.logicalAnd() reduce |
是的 | 緩和 | Java 8+ | 處理所有值 | 由於缺乏短路,大型Map 的效率較低 |
傳統的for 循環 |
是的 | 高的 | Java 7 以下版本 | 一旦發現false 立即停止 |
當不需要 Java 8+ 方法時,最適合較大的Map |
4. 結論
在本教程中,我們回顧了檢查 Java 映射中的所有值是否相同的四種方法。每種方法都有特定的優點,從可讀性和效率到與舊 Java 版本的兼容性。我們的專案需要確定哪種方法是理想的,這個建議應該幫助我們做出最佳選擇。
與往常一樣,這些範例的程式碼可在 GitHub 上取得。