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 评论