Map是可以匹配键值的对象,一个map不能包含重复的键, 一个键最多匹配一个值。Map是对数学上函数的一种抽象建模,map接口包含的方法分为基本操作(例如 put
, get
, remove
, containsKey
, containsValue
, size
, 和 empty
)、批量操作(putAll
和 clear
)和集合视图(keySet
, entrySet
, 和values
)。
Java有三种map的通用实现:HashMap
, TreeMap
以及LinkedHashMap
。
接下来的篇幅我们就要详细描述map接口了。不过,我们首先来看几个在JDK 8里面是怎么样用聚合操作操纵Map的例子。模拟现实世界中的事物是面向对象经常做的事,那么我们就先来看看如果把员工按部门分类。
// Group employees by department
Map<Department, List<Employee>> byDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
按照部门加总薪水
// Compute sum of salaries by department
Map<Department, Integer> totalByDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.summingInt(Employee::getSalary)));
按照过不过级把学生分类
// Partition students into passing and failing
Map<Boolean, List<Student>> passingFailing = students.stream()
.collect(Collectors.partitioningBy(s -> s.getGrade()>= PASS_THRESHOLD));
把人们按城市分类
// Classify Person objects by city
Map<String, List<Person>> peopleByCity
= personStream.collect(Collectors.groupingBy(Person::getCity));
甚至还可以把两个集合连接起来,把人们按省和城市分类:
// Cascade Collectors
Map<String, Map<String, List<Person>>> peopleByStateAndCity
= personStream.collect(Collectors.groupingBy(Person::getState,Collectors.groupingBy(Person::getCity)))
这是利用JDK 8新的API的例子,但是只是很少的一部分。如果你想了解理解的Lamba表达式和聚合操作,请看这里 聚合操作
Map接口的基本操作
http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html