使用Map.Entry的Java类

评论 0 浏览 0 2021-01-29

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上获得。

最后更新2023-03-11
0 个评论
标签