Javaでマップを反復処理する
1. 概要
このクイックチュートリアルでは、JavaのMapのエントリを反復処理するさまざまな方法を見ていきます。
簡単に言うと、 entrySet()、 keySet()、または values()を使用して、Mapの内容を抽出できます。 これらはすべてセットであるため、同様の反復原理がすべてに適用されます。
これらのいくつかを詳しく見てみましょう。
2. MapのentrySet()、keySet()、および values()メソッドの簡単な紹介
3つのメソッドを使用してマップを反復処理する前に、これらのメソッドが何をするかを理解しましょう。
- entrySet() –要素がMap.Entryクラスからのものであるマップのコレクションビューを返します。 entry.getKey()メソッドはキーを返し、 entry.getValue()は対応する値を返します
- keySet() –このマップに含まれるすべてのキーをSetとして返します
- values() –このマップに含まれるすべての値をSetとして返します
3. forループの使用
3.1. entrySet()を使用する
まず、Entry Setを使用してマップを反復する方法を見てみましょう。
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のすべてのキーを取得してから、各キーでマップを反復処理することもできます。
public void iterateUsingKeySetAndForeach(Map<String, Integer> map) {
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
}
3.3. values()を使用した値の反復
場合によっては、マップ内の値にのみ関心があり、どのキーがそれらに関連付けられているかは関係ありません。 この場合、 values()が最適です。
public void iterateValues(Map<String, Integer> map) {
for (Integer value : map.values()) {
System.out.println(value);
}
}
4. イテレータ
反復を実行する別のアプローチは、Iteratorを使用することです。 次に、メソッドがIteratorオブジェクトでどのように機能するかを見てみましょう。
4.1. イテレータおよびentrySet()
まず、イテレータと entrySet()を使用してマップを反復処理しましょう。
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());
}
}
取得する方法に注意してくださいイテレータを使用するインスタンス iterator() のAPI 設定によって返される
4.2. イテレータおよび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. イテレータおよびvalues()
Iteratorおよびvalues()メソッドを使用して、マップの値をウォークスルーすることもできます。
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とStreamAPIの使用
バージョン8以降、Javaは StreamAPIとラムダを導入しました。 次に、これらの手法を使用してマップを反復する方法を見てみましょう。
5.1. forEach()とLambdaを使用する
Java 8の他のほとんどのものと同様に、これは他の方法よりもはるかに単純であることがわかります。 forEach()メソッドを使用します。
public void iterateUsingLambda(Map<String, Integer> map) {
map.forEach((k, v) -> System.out.println((k + ":" + v)));
}
この場合、マップを一連のエントリに変換する必要はありません。 ラムダ式の詳細については、ここから開始できます。
もちろん、キーから始めてマップを反復処理することもできます。
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. StreamAPIの使用
Stream APIは、Java8の重要な機能の1つです。 この機能を使用して、マップをループすることもできます。
Stream APIは、追加のStream処理を計画している場合に使用する必要があります。 それ以外の場合は、前述のように単純な forEach()です。
entrySet()を例として取り上げて、 StreamAPIがどのように機能するかを見てみましょう。
public void iterateUsingStreamAPI(Map<String, Integer> map) {
map.entrySet().stream()
// ... some other Stream processings
.forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));
}
keySet()および values()メソッドでの Stream API の使用法は、上記の例と非常によく似ています。
6. 結論
この記事では、重要でありながら簡単な操作、つまりMapのエントリを反復処理することに焦点を当てました。
Java 8以降でのみ使用できるいくつかのメソッド、つまりLambda式と StreamAPIについて説明しました。
いつものように、この記事のコード例はGitHubのにあります。