在Java中遍历Map

2023/06/07

1. 概述

在这个快速教程中,我们将介绍在Java中循环访问Map条目的不同方法。

简单地说,我们可以使用entrySet()、keySet()或values()提取Map的内容。由于这些都是集合,因此类似的迭代原则适用于所有这些集合。

让我们仔细看看其中的一些。

2. Map的entrySet()、keySet()和values()方法的简短介绍

在使用这三种方法遍历Map之前,让我们先了解一下这些方法的作用:

  • entrySet():返回Map的集合视图,其元素来自Map.Entry类。entry.getKey()方法返回key,entry.getValue()返回对应的value
  • keySet():返回此Map中包含的所有键作为集合
  • values():返回此Map中包含的所有值作为集合

接下来,让我们看看这些方法的实际应用。

3. 使用for循环

3.1 使用entrySet()

首先,让我们看看如何使用EntrySet遍历Map

public void iterateUsingEntrySet(Map<String, Integer> map) {
    for (Map.Entry<String, Integer> entry : map.entrySet()) {
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
}

在这里,我们从Map中提取条目集,然后使用经典的for-each方法遍历它们。

3.2 使用keySet()

或者,我们可以先使用keySet方法获取Map中的所有键,然后按每个键遍历Map:

public void iterateUsingKeySetAndForeach(Map<String, Integer> map) {
    for (String key : map.keySet()) {
        System.out.println(key + ":" + map.get(key));
    }
}

3.3 使用values()迭代值

有时,我们只对Map中的值感兴趣,而不管与它们相关联的键是什么。在这种情况下,values()是我们的最佳选择:

public void iterateValues(Map<String, Integer> map) {
    for (Integer value : map.values()) {
        System.out.println(value);
    }
}

4. Iterator

执行迭代的另一种方法是使用Iterator。接下来,让我们看看这些方法如何与Iterator对象一起使用。

4.1 Iterator 和entrySet()

首先,让我们使用Iterator和entrySet()遍历Map:

public void iterateUsingIteratorAndEntry(Map<String, Integer> map) {
    Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, Integer> entry = iterator.next();
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
}

请注意我们如何使用entrySet()返回的Set的iterator() API获取Iterator实例。然后,像往常一样,我们使用iterator.next()遍历迭代器。

4.2 Iterator和keySet()

同样,我们可以使用Iterator和keySet()遍历Map:

public void iterateUsingIteratorAndKeySet(Map<String, Integer> map) {
    Iterator<String> iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        String key = iterator.next();
        System.out.println(key + ":" + map.get(key));
    }
}

4.3 Iterator和values()

我们还可以使用Iterator和values()方法遍历Map的值:

public void iterateUsingIteratorAndValues(Map<String, Integer> map) {
    Iterator<Integer> iterator = map.values().iterator();
    while (iterator.hasNext()) {
        Integer value = iterator.next();
        System.out.println("value :" + value);
    }
}

5. 使用Lambda和Stream API

从版本8开始,Java引入了Stream API和Lambda。接下来,让我们看看如何使用这些技术迭代Map。

5.1 使用forEach()和Lambda

与Java 8中的大多数其他内容一样,事实证明这比替代方案简单得多。我们只需使用forEach()方法:

public void iterateUsingLambda(Map<String, Integer> map) {
    map.forEach((k, v) -> System.out.println((k + ":" + v)));
}

在这种情况下,我们不需要将Map转换为条目集合。要了解有关Lambda表达式的更多信息,我们可以从这里开始。

当然,我们可以从键开始遍历Map:

public void iterateByKeysUsingLambda(Map<String, Integer> map) {
    map.keySet().foreach(k -> System.out.println((k + ":" + map.get(k))));
}

同样,我们可以对values()方法使用相同的技术:

public void iterateValuesUsingLambda(Map<String, Integer> map) {
    map.values().forEach(v -> System.out.println(("value: " + v)));
}

5.2 使用Stream API

Stream API是Java 8的一个重要特性,我们也可以使用此功能来循环遍历Map。

当我们计划进行一些额外的Stream处理时,应该使用Stream API;否则,它只是一个简单的forEach(),如前所述

下面以entrySet()为例,看看Stream API是如何工作的:

public void iterateUsingStreamAPI(Map<String, Integer> map) {
    map.entrySet().stream()
        // ... some other Stream processings
        .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));
}

Stream API与keySet()和values()方法的用法与上面的示例非常相似。

6. 总结

在本文中,我们重点介绍了一个关键但简单的操作:遍历Map的条目。

我们探讨了几种只能用于Java 8+的方法,即Lambda表达式和Stream API。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章