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");
让我们比较一下两种从地图中获取所有键和值的方法。
2.1。使用Map.keySet
首先,请考虑以下几点:
for (String key : bookMap.keySet()) {
System.out.println("key: " + key + " value: " + bookMap.get(key));
}
在这里,循环遍历keySet 。对于每个键,我们使用Map.get获得相应的值。尽管这是使用映射中所有条目的一种明显方式,但它需要为每个条目执行两项操作-一项操作获取下一个键,而一项操作使用get查找值。
如果只需要映射中的键,则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不同,我们可以有重复的键,在基本Map ,每个键都必须是唯一的。这是因为我们已经使用List实现存储了SimpleEntry对象,这意味着所有对像都是相互独立的。
3.4。 Entry对象列表
我们应该注意, Entry的目的不是充当通用元组。为此,库类通常提供通用的Pair类。
但是,我们可能会发现,在为Map准备数据或从中提取数据时,需要临时处理条目列表。
4。结论
在本文中,我们将Map.entrySet视为迭代Map键的替代方法。
然后,我们研究了如何将Map.Entry用作元组。
最后,我们创建了一个有序元组列表,将差异与基本Map进行了比较。
0 评论