在Java中对一个Map进行迭代
1.概述
在这个快速教程中,我们将了解在Java中迭代Map条目的不同方法。
简单地说,我们可以用entrySet()、keySet()或 values()来提取Map的内容。由于这些都是集合,类似的迭代原则适用于所有这些集合。
让我们仔细看看其中的几项内容。
进一步的阅读。
2.简要介绍Map的entrySet(), 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()返回的Set的iterator()API获得Iterator的实例。然后,像往常一样,我们用iterator.next()来循环浏览Iterator。
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.使用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()));
}
StreamAPI与keySet()和values()方法的用法将与上面的例子相当相似。
6.结语
在这篇文章中,我们重点讨论了一个关键但简单的操作:迭代Map中的条目。
我们探索了一些只能在Java 8+中使用的方法,即Lambda表达式和Stream API。
一如既往,本文中的代码示例可以在GitHub上找到。