1. 概要

このクイックチュートリアルでは、JavaのMapのエントリを反復処理するさまざまな方法を見ていきます。

簡単に言うと、 entrySet() keySet()、または values()を使用して、Mapの内容を抽出できます。 これらはすべてセットであるため、同様の反復原理がすべてに適用されます。

これらのいくつかを詳しく見てみましょう。

2. MapentrySet()、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 設定によって返される entrySet()。 次に、いつものように、ループしますイテレータ iterator.next()。

4.2. イテレータおよびkeySet()

同様に、 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. イテレータおよび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にあります。