web-dev-qa-db-ja.com

Java 8 for MapエントリセットのforEachループ

私は、マップエントリセットのために、ループごとに古いループをループごとにJava 7までJava 8に変換しようとしていますが、エラーになります。これが私が変換しようとしているコードです:

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

これが私がした変更です。

map.forEach( Map.Entry<String, String> entry -> {
       System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());

   }); 

私もこれをやってみました:

Map.Entry<String, String> entry;
   map.forEach(entry -> {
       System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());

   });

それでもエラーに直面しています。このエラーは、ラムダ式のシグネチャが関数型インタフェースメソッドaccept(String, String)のシグネチャと一致しないことです。

65

Read javadocMap<K, V>.forEach()は引数としてBiConsumer<? super K,? super V>を想定しており、BiConsumer<T, U>抽象メソッドのシグネチャはaccept(T t, U u)です。

そのため、引数として2つの入力(キーと値)をとるラムダ式を渡す必要があります。

map.forEach((key, value) -> {
    System.out.println("Key : " + key + " Value : " + value);
});

マップ自体ではなく、マップのエントリセットに対してforEach()を呼び出した場合、コードは機能します。

map.entrySet().forEach(entry -> {
    System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}); 
154
JB Nizet

「どのバージョンが速いのか、どのバージョンを使うのか」といった質問に答えるための最善の方法かもしれません。ソースコードを見ることです:

map.forEach() - Map.Javaより

default void forEach(BiConsumer<? super K, ? super V> action) {
    Objects.requireNonNull(action);
    for (Map.Entry<K, V> entry : entrySet()) {
        K k;
        V v;
        try {
            k = entry.getKey();
            v = entry.getValue();
        } catch(IllegalStateException ise) {
            // this usually means the entry is no longer in the map.
            throw new ConcurrentModificationException(ise);
        }
        action.accept(k, v);
    }
}

javadoc

map.entrySet()。forEach() - Iterable.Javaより

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

javadoc

これはすぐにmap.forEach()も内部的にMap.Entryを使っていることを明らかにします。したがって、map.entrySet()。forEach()よりもmap.forEach()を使用しても、パフォーマンス上の利点はありません。だからあなたの場合、答えは本当にあなたの個人的な好みによります:)

相違点の完全なリストについては、提供されているjavadocリンクを参照してください。ハッピーコーディング!

11
Evgeny Tugarev

あなたの要件には、次のコードを使用することができます

map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
6
HashMap<String,Integer> hm = new HashMap();

 hm.put("A",1);
 hm.put("B",2);
 hm.put("C",3);
 hm.put("D",4);

 hm.forEach((key,value)->{
     System.out.println("Key: "+key + " value: "+value);
 });
0
vaibhav1111