`
sungang_1120
  • 浏览: 321570 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Guava Collections API学习之Multimap

阅读更多

 

      相信大家对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());  
		}
	}

 

 

结果如下:

 

女:[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提供了下面的结构

 

import 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实现上面同样的功能代码有点像

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。例如:

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>,即使如此,它们之间还是有区别的:

 

 

  1. Multimap.get(key) 总是返回一个unll值(可能是一个空的collection);
  2. 可以利用asMap()方法来得到一个 Map<K, Collection<V>>类型的数据(或者利用ListMultimap中的静态方法Multimaps.asMap()得到一个Map<K, List<V>类型的数据; SetMultimap和SortedSetMultimap也类似);
  3. Multimap.containsKey(key)只有在这个key和一个或者多个元素相关联的时候才会返回true,如果这个key在删除之前和一个或者多个元素相关联则函数将会返回false;
  4. Multimap.entries()返回Multimap所有实体的所有key值;
  5. Multimap.size()返回在Multimap中存放的所有实体的数量,而不是不同keys的数量。我们可以利用Multimap.keySet().size()得到Multimap中所有不同keys的数量。

 

分享到:
评论

相关推荐

    Google-Guava-Collections-使用介绍

    Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java Collections ...

    guava collection简介1

    Guava Collections 是 Google 的工程师 Kevin Bourrillion 和 Jared Levy 创作的一个开源库,利用他们在公司内部“20%”自由时间开发的成果。这个库是对 Java Collections Framework 的一个增强和扩展,旨在提供更...

    guava参考文档

    虽然Java 8引入了流API,但Guava早在其之前就提供了类似的功能,如`FluentIterable`,它允许链式操作并提供了便利的转换和过滤方法。 7. **其他功能**: - **检查类(CheckArgument, CheckNotNull等)**: 提供了...

    Google中的Guava源码

    Guava is a set of core Java libraries from Google that includes new collection types (such as multimap and multiset), immutable collections, a graph library, and utilities for concurrency, I/O, ...

    Android代码-guava

    multimap and multiset), immutable collections, a graph library, functional types, an in-memory cache, and APIs/utilities for concurrency, I/O, hashing, primitives, reflection, string processing, and ...

    guava(google的java集合包)

    1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)和Immutable Collections(不可变集合)。这些集合类型在处理复杂数据结构时,提供了更强大的功能和更高的灵活性。例如,...

    jackson-datatype-guava-2.8.0.zip

    《Jackson Datatype Guava与Collections模块详解》 Jackson,由FasterXML开发并维护的Java JSON库,是Java世界中最广泛使用的JSON解析器之一。它提供了高效、灵活且功能丰富的API,使得JSON序列化和反序列化变得...

    mahout的guava-r09-jar

    4. **函数式编程**:Guava的Predicates、Functions和Collections2等工具,支持函数式编程风格,使得代码更简洁且易于测试。 5. **I/O工具**:例如Files类提供了一系列静态方法,简化了文件操作,而CharMatcher则...

    guava-jdk5

    7. **流(Stream)操作**:虽然Java 5本身不支持Stream API,但Guava的Iterables和Collections提供了类似的功能,如FluentIterable,允许进行链式操作,实现数据的过滤、转换等。 8. **事件监听**:Guava的 EventBus ...

    guava-18.0资料

    1. **集合框架扩展**:Guava提供了丰富的集合类型,如Multiset(多集)、Multimap(多映射)和Table(表格),以及对Set、List和Map的高级实现,如ImmutableCollections(不可变集合)。这些集合可以更好地处理特定...

    Guava常用类库 v33.0.0.zip

    1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、BiMap(双映射)和Immutable Collections(不可变集合)。这些集合类扩展了Java标准库,提供更强大、更灵活的功能,如泛型...

    google guava

    Guava的I/O模块提供了一套更强大、更灵活的文件操作API。它可以处理流(Streams)、通道(Channels)和缓冲区(Buffers),并且支持异步读写。此外,Guava还提供了方便的资源管理工具,如Closer,确保文件和网络...

    guava源码src

    1. **Guava集合框架**:Guava提供了许多强大的集合类,如Multiset、Multimap、ImmutableList、ImmutableSet和ImmutableMap等。这些集合类不仅在功能上超越了Java标准库,还在性能和线程安全性上有所优化。例如,...

    Google的guava实战

    首先,Guava对Java集合框架进行了扩展,提供了一些新的集合类型,比如Multiset、Multimap、Table等,这些集合类型在处理一些特定场景时可以更加方便。此外,Guava还提供了一系列的集合工具类,比如Iterables和...

    Google Guava 30.1.1常用类介绍及实践代码

    - `FluentIterable` 是一个可迭代的包装器,提供了一种流畅的 API 来构建和操作迭代器。它可以用于构建链式调用,使代码更简洁。 ```java FluentIterable&lt;String&gt; names = FluentIterable.from(Arrays.asList(...

    guava-18.0.rar

    Guava 集合框架扩展了 Java 标准库中的集合类,如 `Multiset` 类似于集合并记录元素出现的次数,`Multimap` 允许一个键关联多个值,以及 `Table` 提供了二维表格结构。此外,Guava 还引入了 `ImmutableCollections`...

    Getting Started with Google Guava code

    1. **集合框架增强**:Guava 提供了丰富的集合类,如 Multiset(多集合)、Multimap(多映射)、Immutable collections(不可变集合)等,这些集合在功能和性能上都优于 Java 标准库中的集合。 2. **缓存**:Guava ...

    Guava教程1使用GoogleCollections,G

    Guava早在Java 8的Stream API之前就引入了FluentIterable,它提供了类似Stream的功能,可以方便地对集合进行链式操作。例如: ```java FluentIterable&lt;String&gt; iterable = FluentIterable.from(Arrays.asList("a...

Global site tag (gtag.js) - Google Analytics