使用Map.Entry的Java类
1.概述
我们经常使用Map来存储一个键值对的集合。然后,在某些时候,我们经常需要对它们进行迭代。
在本教程中,我们将比较Map迭代的不同方法,强调什么时候使用Map.Entry可能是有益的。然后,我们将学习如何使用Map.Entry来创建一个元组。最后,我们将创建一个有序的元组列表。
2.优化Map 迭代
假设我们有一张以作者姓名为键的书名图。
Map<String, String> map = new HashMap<>();
map.put("Robert C. Martin", "Clean Code");
map.put("Joshua Bloch", "Effective Java");
让我们来比较一下从我们的Map中获取所有键和值的两种方法。
2.1.使用Map.keySet
首先,请考虑以下几点:
for (String key : bookMap.keySet()) {
System.out.println("key: " + key + " value: " + bookMap.get(key));
}
这里,循环遍历keySet。对于每个键,我们使用Map.get获得相应的值。虽然这是一个使用Map中所有条目的明显方法,但它需要对每个条目进行两次操作--一次是获取下一个键,一次是用get来查询值。
如果我们只需要Map中的键, keySet是一个不错的选择。然而,有一种更快的方法可以同时获得键和值。
2.2.使用Map.entrySet 代替
让我们重写我们的迭代,以使用entrySet。
for (Map.Entry<String, String> book: bookMap.entrySet()) {
System.out.println("key: " + book.getKey() + " value: " + book.getValue());
}
在这个例子中,我们的循环是在一个Map.Entry对象的集合上。由于Map.Entry在一个类中同时存储了键和值,我们在一次操作中获得它们。
同样的规则适用于使用Java 8流操作。在entrySet上进行流操作,并使用Entry对象,效率更高,需要的代码更少。
3.使用元组工作
元组是一种有固定数量和顺序的元素的数据结构。我们可以认为Map.Entry是一个元组,它存储了两个元素 – 一个键和一个值。然而,由于Map.Entry是一个接口,我们需要一个实现类。在本节中,我们将探讨JDK提供的一个实现。AbstractMap.SimpleEntry。
3.1.创建一个元组
首先,考虑一下Book类。
public class Book {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
...
接下来,让我们创建一个 Map.Entry 元组,以ISBN为键,以Book对象为值。
Map.Entry<String, Book> tuple;
最后,让我们用AbstractMap.SimpleEntry对我们的元组进行实例化。
tuple = new AbstractMap.SimpleEntry<>("9780134685991", new Book("Effective Java 3d Edition", "Joshua Bloch"));
3.2.创建一个有序的元组列表
在处理元组时,将它们作为一个有序的列表往往是很有用的。
首先,我们将定义我们的元组列表。
List<Map.Entry<String, Book>> orderedTuples = new ArrayList<>();
其次,让我们为我们的名单添加一些条目。
orderedTuples.add(new AbstractMap.SimpleEntry<>("9780134685991",
new Book("Effective Java 3d Edition", "Joshua Bloch")));
orderedTuples.add(new AbstractMap.SimpleEntry<>("9780132350884",
new Book("Clean Code","Robert C Martin")));
3.3.与Map相比较
为了比较与Map的差异,让我们用一个已经存在的键添加一个新的条目。
orderedTuples.add(new AbstractMap.SimpleEntry<>("9780132350884",
new Book("Clean Code", "Robert C Martin")));
其次,我们将在我们的列表上进行迭代,显示所有的键和值。
for (Map.Entry<String, Book> tuple : orderedTuples) {
System.out.println("key: " + tuple.getKey() + " value: " + tuple.getValue());
}
最后,让我们来看看输出结果。
key: 9780134685991 value: Book{title='Effective Java 3d Edition', author='Joshua Bloch'}
key: 9780132350884 value: Book{title='Clean Code', author='Robert C Martin'}
key: 9780132350884 value: Book{title='Clean Code', author='Robert C Martin'}
注意,我们可以有重复的键,不像基本的Map,每个键都必须是唯一的。这是因为我们使用了一个List实现来存储我们的SimpleEntry对象,这意味着所有的对象都是相互独立的。
3.4.列表中的Entry对象
我们应该注意,Entry的目的不是作为一个通用元组。库类通常提供一个通用的Pair类来达到这个目的。
然而,我们可能会发现,在为Map准备数据或从Map中提取数据时,我们需要临时处理条目列表。
4.总结
在这篇文章中,我们研究了Map.entrySet,作为在地图的键上进行迭代的一种替代方法。
然后我们看了一下Map.Entry如何作为一个元组使用的。
最后,我们创建了一个有序图元的列表,将其与基本的Map进行比较。
像往常一样,示例代码可在GitHubover上获得。