相信大家对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>,即使如此,它们之间还是有区别的:
- Multimap.get(key) 总是返回一个unll值(可能是一个空的collection);
- 可以利用asMap()方法来得到一个 Map<K, Collection<V>>类型的数据(或者利用ListMultimap中的静态方法Multimaps.asMap()得到一个Map<K, List<V>类型的数据; SetMultimap和SortedSetMultimap也类似);
- Multimap.containsKey(key)只有在这个key和一个或者多个元素相关联的时候才会返回true,如果这个key在删除之前和一个或者多个元素相关联则函数将会返回false;
- Multimap.entries()返回Multimap所有实体的所有key值;
- Multimap.size()返回在Multimap中存放的所有实体的数量,而不是不同keys的数量。我们可以利用Multimap.keySet().size()得到Multimap中所有不同keys的数量。
相关推荐
Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java Collections ...
Guava Collections 是 Google 的工程师 Kevin Bourrillion 和 Jared Levy 创作的一个开源库,利用他们在公司内部“20%”自由时间开发的成果。这个库是对 Java Collections Framework 的一个增强和扩展,旨在提供更...
虽然Java 8引入了流API,但Guava早在其之前就提供了类似的功能,如`FluentIterable`,它允许链式操作并提供了便利的转换和过滤方法。 7. **其他功能**: - **检查类(CheckArgument, CheckNotNull等)**: 提供了...
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, ...
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 ...
1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)和Immutable Collections(不可变集合)。这些集合类型在处理复杂数据结构时,提供了更强大的功能和更高的灵活性。例如,...
《Jackson Datatype Guava与Collections模块详解》 Jackson,由FasterXML开发并维护的Java JSON库,是Java世界中最广泛使用的JSON解析器之一。它提供了高效、灵活且功能丰富的API,使得JSON序列化和反序列化变得...
4. **函数式编程**:Guava的Predicates、Functions和Collections2等工具,支持函数式编程风格,使得代码更简洁且易于测试。 5. **I/O工具**:例如Files类提供了一系列静态方法,简化了文件操作,而CharMatcher则...
7. **流(Stream)操作**:虽然Java 5本身不支持Stream API,但Guava的Iterables和Collections提供了类似的功能,如FluentIterable,允许进行链式操作,实现数据的过滤、转换等。 8. **事件监听**:Guava的 EventBus ...
1. **集合框架扩展**:Guava提供了丰富的集合类型,如Multiset(多集)、Multimap(多映射)和Table(表格),以及对Set、List和Map的高级实现,如ImmutableCollections(不可变集合)。这些集合可以更好地处理特定...
1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、BiMap(双映射)和Immutable Collections(不可变集合)。这些集合类扩展了Java标准库,提供更强大、更灵活的功能,如泛型...
Guava的I/O模块提供了一套更强大、更灵活的文件操作API。它可以处理流(Streams)、通道(Channels)和缓冲区(Buffers),并且支持异步读写。此外,Guava还提供了方便的资源管理工具,如Closer,确保文件和网络...
1. **Guava集合框架**:Guava提供了许多强大的集合类,如Multiset、Multimap、ImmutableList、ImmutableSet和ImmutableMap等。这些集合类不仅在功能上超越了Java标准库,还在性能和线程安全性上有所优化。例如,...
首先,Guava对Java集合框架进行了扩展,提供了一些新的集合类型,比如Multiset、Multimap、Table等,这些集合类型在处理一些特定场景时可以更加方便。此外,Guava还提供了一系列的集合工具类,比如Iterables和...
- `FluentIterable` 是一个可迭代的包装器,提供了一种流畅的 API 来构建和操作迭代器。它可以用于构建链式调用,使代码更简洁。 ```java FluentIterable<String> names = FluentIterable.from(Arrays.asList(...
Guava 集合框架扩展了 Java 标准库中的集合类,如 `Multiset` 类似于集合并记录元素出现的次数,`Multimap` 允许一个键关联多个值,以及 `Table` 提供了二维表格结构。此外,Guava 还引入了 `ImmutableCollections`...
1. **集合框架增强**:Guava 提供了丰富的集合类,如 Multiset(多集合)、Multimap(多映射)、Immutable collections(不可变集合)等,这些集合在功能和性能上都优于 Java 标准库中的集合。 2. **缓存**:Guava ...
Guava早在Java 8的Stream API之前就引入了FluentIterable,它提供了类似Stream的功能,可以方便地对集合进行链式操作。例如: ```java FluentIterable<String> iterable = FluentIterable.from(Arrays.asList("a...