JAVA 通过value获取Map中key的三种方法

  • 简介
  • 方法描述
    • 循环法
    • Stream方法
    • Apache Commons Collections的BidiMap
  • 总结

简介

我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值。然而,有的时候我们需要反过来获取,知道Value值,求Key值。
本文将用实例介绍三种方法,通过传入Value值,获取得到Key值。

方法描述

循环法

循环法就是通过遍历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总是在多种集合操作上都能提供优雅直观的方法,易写但不易读。通过一个过滤器,即可把满足相等条件的值取出来。

@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值。

@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)); // ASystem.out.println(bidiMap.getKey(2)); // DSystem.out.println(bidiMap.getKey(3)); // nullSystem.out.println(bidiMap.getKey(4)); // nullSystem.out.println(bidiMap.getKey(null)); // CSystem.out.println(bidiMap.getKey(9)); // ESystem.out.println(bidiMap); // {A=1, C=null, D=2, E=9}
}

从代码执行可知,如果出现key或者value相同的情况,后者会被替代。

总结

本文介绍了三种通过Value值获取Map中的Key值的方法,分别是循环法、Stream、Apache Commons Collections,这三种方法类似但不尽相同。

  1. 循环法和使用Stram本质上都是要遍历的,如果一个Map经常需要反向取Key值,则不建议使用,可以考虑Apache Commons提供的双向Map;
  2. 双向Map其实是一种空间换取时间的思想,虽然能较快的找到满足条件的Key值,但它也使用了更多的空间来储存双向Map;
  3. 双向Map并不支持多对一的关系。

如何选择,就看具体需求来取舍了。

JAVA 通过value获取Map中key的三种方法相关推荐

  1. Java获取map中key和value的方法

    最近项目技术转型,开始使用java来写需求.需求中碰到需要获取map中key和value的地方,网络上查了下,得到了解决方法.为防止遗忘,故记录于此. java中获取map中key和value的方式有 ...

  2. JAVA 取出Map元素值 的三种方法

    JAVA 取出Map元素值 的三种方法: (1)方法一: 通过Map的keySet()方法获取key 的set ,迭代set元素(每个元素调再用Map的get()方法); (2)方法二 : 通过Map ...

  3. php 正则获取数字,php结合正则获取字符串中数字的几种方法

    本篇文章主要介绍php结合正则获取字符串中数字的几种方法,感兴趣的朋友参考下,希望对大家有所帮助. php结合正则获取字符串中数字<?php $patterns = "/\d+/&qu ...

  4. java定时执行某个方法_Java中定时执行任务的三种方法

    Java中定时执行任务的三种方法 1)java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务: Timer timer=new Timer(); timer.sche ...

  5. JS获取URL中参数值的4种方法

    方法一:正则法 function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(& ...

  6. java 当前时间string_Java 获取当前系统时间的三种方法

    准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...

  7. web java获取当前时间_Java 获取当前系统时间的三种方法

    准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...

  8. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  9. PHP中删除目录的三种方法

    原文链接:http://www.chinaz.com/program/2008/1022/41645.shtml PHP中删除目录的三种方法 1.递规法:利用递归一层一层的删. deleteDir($ ...

最新文章

  1. ubuntu中命令打开图片、文档、音乐、视频等
  2. TalkingData:2014年移动打车应用行业报告
  3. 跳转控制语句 break || continue || goto
  4. [转载] 百科全说——栾加芹:你适合这些食物吗?(11-03-07)
  5. 海归硕士程序员吐槽:我回国竟然找不到工作,这到底是什么操作?
  6. VC中树状控件(TreeCtrl)的用法
  7. c语言仓库即存储器,计算机基础4
  8. linux内核nasm,在x86汇编代码,NASM,Linux中操作字符串
  9. 坐着童年纸飞机的C语言for循环!超好玩!超详细!
  10. 计算机音乐雅俗共赏,“雅俗共赏”与音乐教育
  11. 金融信创爆发年,优炫数据库高可用高性能解决方案
  12. [pwnable.kr]passcode
  13. ARM嵌入式主板之路
  14. 2018年英语专升本英语阅读「Part II 阅读专区」【文章(图片)、答案、词汇记忆】
  15. kube-controller-manager源码分析(三)之 Informer机制
  16. java rollback_Spring中的@Transactional(rollbackFor = Exception.class)属性详解
  17. 如何理解shared library
  18. 三星s4 android8,三星可升级安卓8.0设备名单泄露 S6无缘
  19. Spark学习(二)Spark高可用集群搭建
  20. C++ 内存对齐详解加配图分析

热门文章

  1. Apache Airflow Unauthorized
  2. 20230209 Python的列表及相关操作
  3. 软件测试常见的六大类型和关注点分析
  4. MySql主要性能指标说明
  5. .NET应用跨域问题解决方案
  6. 痛心!一题可见余之弱鸡
  7. 一文了解Linux磁盘缓存机制
  8. java程序设计娄不夜_Java程序设计 9787302209843 娄不夜 清华大学出版社
  9. AES加密原理及简单逆向解题思路 - 从0开始的repwn 02
  10. Shell中while循环的done 后接一个重定向