最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java通過value獲取Map中key的三種實現(xiàn)過程

 更新時間:2026年01月09日 08:58:07   作者:她又在叢中笑  
本文介紹了三種通過Value值獲取Map中的Key值的方法:循環(huán)法、Stream方法和ApacheCommonsCollections的BidiMap,每種方法都有其特點和適用場景,選擇哪種方法應根據(jù)具體需求來決定

簡介

我們都知道Map是存放鍵值對<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速獲取Value值。然而,有的時候我們需要反過來獲取,知道Value值,求Key值。

本文將用實例介紹三種方法,通過傳入Value值,獲取得到Key值。

方法描述

循環(huán)法

循環(huán)法就是通過遍歷Map里的Entry,一個個比較,把符合條件的找出來。

@Test
public void loop() {
	Map<String, Integer> map = new HashMap<>();
	map.put("A", 1);
	map.put("B", 2);
	map.put("C", 3);
	map.put("D", 2);
	//找到一個值
	getKeyByLoop(map, 1);
	//找到多個值
	getKeysByLoop(map, 2);
	//找不到
	getKeyByLoop(map, 4);
}

private <K, V> Set<K> getKeysByLoop(Map<K, V> map, V value) {
	Set<K> set = Sets.newHashSet();
	for (Map.Entry<K, V> entry : map.entrySet()) {
		if (Objects.equals(entry.getValue(), value)) {
			set.add(entry.getKey());
		}
	}
	return set;
}

Stream方法

Stream總是在多種集合操作上都能提供優(yōu)雅直觀的方法,易寫但不易讀。通過一個過濾器,即可把滿足相等條件的值取出來。

@Test
public void stream() {
	Map<String, Integer> map = ImmutableMap.of("A", 1, "B", 2, "C", 3, "D", 2);
	getKeysByStream(map, 2);
}

private <K, V> Set<K> getKeysByStream(Map<K, V> map, V value) {
	return map.entrySet()
		.stream()
		.filter(kvEntry -> Objects.equals(kvEntry.getValue(), value))
		.map(Map.Entry::getKey)
		.collect(Collectors.toSet());
}

Apache Commons Collections的BidiMap

添加依賴:

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-collections4</artifactId>
	<version>4.0</version>
</dependency>

Apache Commons Collections提供了雙向Map的類BidiMap。它提供了getKey(value)方法返回Key值,且兼容get(key)方法用以獲取value。

@Test
public void apacheCommons() {
	BidiMap<String, Integer> bidiMap = new DualHashBidiMap<>();
    bidiMap.put("A", 1);
    bidiMap.put("B", 3);
    bidiMap.put("B", 2);
    bidiMap.put("E", 9);
    bidiMap.put("C", null);
    bidiMap.put("D", 2);
    System.out.println(bidiMap.getKey(1)); // A
    System.out.println(bidiMap.getKey(2)); // D
    System.out.println(bidiMap.getKey(3)); // null
    System.out.println(bidiMap.getKey(4)); // null
    System.out.println(bidiMap.getKey(null)); // C
    System.out.println(bidiMap.getKey(9)); // E
    
	System.out.println(bidiMap.getOrDefault("A",null)); // 1
    System.out.println(bidiMap.getOrDefault("B",null)); // null
    System.out.println(bidiMap.getOrDefault("C",null)); // null
    System.out.println(bidiMap.getOrDefault("D",null)); // 2
    System.out.println(bidiMap.getOrDefault("E",null)); // 9
   
    System.out.println(bidiMap); // {A=1, C=null, D=2, E=9}
}

從代碼執(zhí)行可知,如果出現(xiàn)key或者value相同的情況,前者會被后者替代。

總結

本文介紹了三種通過Value值獲取Map中的Key值的方法,分別是循環(huán)法、Stream、Apache Commons Collections,這三種方法類似但不盡相同。

  1. 循環(huán)法和使用Stram本質(zhì)上都是要遍歷的,如果一個Map經(jīng)常需要反向取Key值,則不建議使用,可以考慮Apache Commons提供的雙向Map;
  2. 雙向Map其實是一種空間換取時間的思想,雖然能較快的找到滿足條件的Key值,但它也使用了更多的空間來儲存雙向Map;
  3. 雙向Map并不支持多對一的關系。

如何選擇,就看具體需求來取舍了。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java之jpa入門教程講解

    Java之jpa入門教程講解

    這篇文章主要介紹了Java之jpa入門教程講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • servlet實現(xiàn)文件上傳、預覽、下載、刪除功能

    servlet實現(xiàn)文件上傳、預覽、下載、刪除功能

    這篇文章主要為大家詳細介紹了servlet實現(xiàn)文件上傳、預覽、下載、刪除功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Springboot集成GraphicsMagick

    Springboot集成GraphicsMagick

    本文主要是教大家如何將GraphicsMagick命令行工具集成到Springboot項目中,便可以使用Java進行圖片處理相關開發(fā)。
    2021-05-05
  • 詳解Maven optional關鍵字透徹圖解

    詳解Maven optional關鍵字透徹圖解

    這篇文章主要介紹了詳解Maven optional關鍵字透徹圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Spring中HandlerMapping接口源碼詳解

    Spring中HandlerMapping接口源碼詳解

    這篇文章主要介紹了Spring中HandlerMapping接口源碼詳解,RequestMappingHandlerMapping類就是實現(xiàn)此接口并將容器中所有的控制器的RequestMappingInfo請求和HandlerMethod注冊到內(nèi)存之中,需要的朋友可以參考下
    2023-11-11
  • SpringBoot?表單提交全局日期格式轉換器實現(xiàn)方式

    SpringBoot?表單提交全局日期格式轉換器實現(xiàn)方式

    這篇文章主要介紹了SpringBoot?表單提交全局日期格式轉換器,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • MyBatis Plus復合主鍵問題的解決

    MyBatis Plus復合主鍵問題的解決

    在數(shù)據(jù)庫設計中,有時候需要使用復合主鍵來唯一標識表中的一行數(shù)據(jù),本文將為您詳細介紹MyBatis Plus中復合主鍵的問題以及解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Mybatis?SQL數(shù)量限制插件的實現(xiàn)

    Mybatis?SQL數(shù)量限制插件的實現(xiàn)

    本文介紹了一種應對大數(shù)據(jù)查詢風險的Mybatis插件,通過配置限制查詢結果數(shù)量,并支持動態(tài)調(diào)整和特殊接口繞過,具有一定的參考價值,感興趣的可以了解一下
    2025-07-07
  • Java 遍歷 String 字符串所有字符的操作

    Java 遍歷 String 字符串所有字符的操作

    這篇文章主要介紹了Java 遍歷 String 字符串所有字符的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java基礎第四篇 封裝與接口

    Java基礎第四篇 封裝與接口

    本文將對介紹Java 的封裝與接口進行介紹,將要封裝(encapsulation)對象的成員(成員包括數(shù)據(jù)成員和方法),從而只允許從外部調(diào)用部分的成員。利用封裝,我們可以提高對象的易用性和安全性。想具體了解的小伙伴請參考下面文章的內(nèi)容
    2021-09-09

最新評論

双城市| 乌苏市| 神池县| 东方市| 德惠市| 清镇市| 贵南县| 辽宁省| 南充市| 莱芜市| 中方县| 青阳县| 松阳县| 青冈县| 酒泉市| 成武县| 土默特右旗| 高雄县| 大兴区| 嵊州市| 松桃| 宾川县| 平顶山市| 梧州市| 原平市| 临颍县| 万全县| 大冶市| 巴青县| 金秀| 田阳县| 宝坻区| 信阳市| 扎囊县| 镶黄旗| 鄄城县| 云阳县| 天柱县| 景东| 新巴尔虎左旗| 九江市|