私は、マップエントリセットのために、ループごとに古いループをループごとに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)
のシグネチャと一致しないことです。
Read javadoc :Map<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());
});
「どのバージョンが速いのか、どのバージョンを使うのか」といった質問に答えるための最善の方法かもしれません。ソースコードを見ることです:
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);
}
}
map.entrySet()。forEach() - Iterable.Javaより
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
これはすぐにmap.forEach()も内部的にMap.Entryを使っていることを明らかにします。したがって、map.entrySet()。forEach()よりもmap.forEach()を使用しても、パフォーマンス上の利点はありません。だからあなたの場合、答えは本当にあなたの個人的な好みによります:)
相違点の完全なリストについては、提供されているjavadocリンクを参照してください。ハッピーコーディング!
あなたの要件には、次のコードを使用することができます
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
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);
});