相信你们对Java中的Map类及其之类有大体的了解,Map类是以键值对的形式来存储元素(Key->Value),可是熟悉Map的人都知 道,Map中存储的Key是惟一的。什么意思呢?就是假如咱们有两个key相同,但value不一样的元素须要插入到map中去,那么先前的key对应的 value将会被后来的值替换掉。若是咱们须要用Map来把相同key的值存在一块儿,代码看起来像下面同样:函数
@Test public void test1(){ List<Person> personList = new ArrayList<Person>(); Person person = new Person("孙刚1", "21", "男"); Person person2 = new Person("孙刚2", "21", "男"); Person person3 = new Person("孙刚3", "21", "女"); Person person4 = new Person("孙刚4", "21", "男"); Person person5 = new Person("孙刚5", "21", "女"); Person person6 = new Person("孙刚6", "21", "男"); personList.add(person); personList.add(person2); personList.add(person3); personList.add(person4); personList.add(person5); personList.add(person6); genderStatistics(personList); } //性别统计 public void genderStatistics(List<Person> personList){ Optional<List<Person>> optionalForPerson= Optional.fromNullable(personList); if (!optionalForPerson.isPresent()) { return; } Map<String, List<Person>> map = new HashMap<String, List<Person>>(); for (Person person : personList) { String sex = person.getSex(); List<Person> persons = map.get(sex); if (null == persons) {//第一次加入 persons = new ArrayList<Person>(); } persons.add(person); map.put(sex, persons); } for(Entry<String, List<Person>> entry : map.entrySet()){ String key = entry.getKey(); System.out.println(key + ":" + entry.getValue()); } }
结果以下:google
女:[Person [name=孙刚3, age=21, sex=女], Person [name=孙刚5, age=21, sex=女]]
男:[Person [name=孙刚1, age=21, sex=男], Person [name=孙刚2, age=21, sex=男], Person [name=孙刚4, age=21, sex=男], Person [name=孙刚6, age=21, sex=男]]
虽然实现了功能,可是代码比较长,可是若是你用Guava去实现一样的功能,你会发现你的代码一会儿变少了。Guava提供了下面的结构spa
mport com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; Multimap<K, V> myMultimap = ArrayListMultimap.create();
从名字能够看出,Multimap能够存放的key值是不惟一的,Multimap并无实现 Map 的接口,因此不须要达到键惟一的要求。若是存放了key同样的元素,Multimap并不会覆盖之前相同的key元素,而是加进去了。结果有点像{k1= [v1, v2, v3], k2=[v7, v8],….}其中v1, v2, v3对应的key都是k1,而若是是Map,则它的结果有点像{k1=v1, k2=v2,…}看到区别了吧?那么,用Multimap实现上面一样的功能代码有点像code
Multimap<String, Person> myMultimap = ArrayListMultimap.create(); for (Person person : personList) { String sex = person.getSex(); myMultimap.put(sex, person); } Map<String, Collection<Person>> map1 = myMultimap.asMap(); for (Entry<String, Collection<Person>> entry : map1.entrySet()) { String key = entry.getKey(); System.out.println(key + "\t" + entry.getValue()); }
看到了吧,代码简单多了吧!这里有一点你可能会疑惑,就是为什么get方法返回的是一个Collection而不是list,这是由于前者会更加有用。若是 你须要基于multimap直接操做list或者set,那么能够在定义类型的时候使用子类名称:ListMultimap,SetMultimap和 SortedSetMultimap。例如:blog
ListMutlimap<String,Person> myMutlimap = ArrayListMultimap.create(); // Returns a List, not a Collection. List<Person> myValues = myMutlimap.get("myKey");
这里须要再次强调的是,Multimap不是Map(Multimap Is Not A Map)!接口
一 个Multimap<K, V>不是一个Map<K, Collection<V>>, 虽然咱们能够利用Map<K, Collection<V>>来实现Multimap<K, V>,即便如此,它们之间仍是有区别的:v8