在Java中对一个Map进行迭代

评论 0 浏览 0 2017-06-23

1.概述

在这个快速教程中,我们将了解在Java中迭代Map条目的不同方法。

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

让我们仔细看看其中的几项内容。

进一步的阅读。

Java 8 forEach的指南

如何用索引在流上进行迭代

寻找Java Map中的最高值

2.简要介绍MapentrySet(), keySet(), 和values()方法

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

  • entrySet() – 返回Map的集合视图,其元素来自Map.Entry类。entry.getKey()方法返回键,而entry.getValue()返回相应的值。
  • keySet() – 以Set的形式返回包含在此Map中的所有键值。
  • values() – 以Set的形式返回该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中提取Set的条目,然后使用经典的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对象中工作的。

4.1. Iterator and 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()返回的Setiterator()API获得Iterator的实例。然后,像往常一样,我们用iterator.next()来循环浏览Iterator

4.2.IteratorkeySet()

同样地,我们可以使用IteratorkeySet()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.Iteratorvalues()

我们还可以使用Iteratorvalues()方法来浏览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.使用Lambdas和Stream API

从第8版开始,Java引入了Stream API和lambdas。接下来,让我们看看如何使用这些技术来迭代一个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处理时,应该使用StreamAPI;否则,它只是一个简单的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()));
}

StreamAPIkeySet()values()方法的用法将与上面的例子相当相似。

6.结语

在这篇文章中,我们重点讨论了一个关键但简单的操作:迭代Map中的条目。

我们探索了一些只能在Java 8+中使用的方法,即Lambda表达式和Stream API。

一如既往,本文中的代码示例可以在GitHub上找到。

最后更新2023-10-23
0 个评论
标签