Estoy tratando de convertir el antiguo convencional para cada bucle hasta java7 a java8 para cada bucle para un conjunto de entradas de mapa, pero obtengo un error. Aquí está el código que estoy tratando de convertir:
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
Estos son los cambios que hice:
map.forEach( Map.Entry<String, String> entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Intenté hacer esto también:
Map.Entry<String, String> entry;
map.forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Pero aún enfrenta el error. El error que recibo para esto es: la firma de la expresión Lambda no coincide con la firma del método de interfaz funcionalaccept(String, String)
Map.Entry
a crear una instancia para cada entrada; el primero le da la clave y el valor sin instanciación. PorMap.Entry
lo tanto, es un intermediario y puedes evitarlo usando la primera versión.Map
implementaciones, lasMap.Entry
instancias ya existen antes de la iteración y no es necesario crearlas . Aún así, no tener que lidiar conMap.Entry
la acción es una ventaja en la legibilidad y tiene un pequeño potencial para un mejor rendimiento, ya que no se requieren invocaciones de métodos adicionales para recuperar la clave y el valor.Map
implementaciones , pero no para todas , eso es cierto,ConcurrentHashMap
siendo un importante contraejemplo.ConcurrentHashMap
, las instancias de entrada temporal son lo último de lo que preocuparse. Sin embargo, estamos de acuerdo en preferir demap.forEach((key, value) -> …);
todos modos…Quizás la mejor manera de responder preguntas como "¿qué versión es más rápida y cuál debo usar?" es mirar el código fuente:
map.forEach () - desde 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 () - de Iterable.java
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
javadoc
Esto inmediatamente revela que map.forEach () también está usando Map.Entry internamente. Por lo tanto, no esperaría ningún beneficio de rendimiento al usar map.forEach () sobre map.entrySet (). ForEach () . Entonces, en su caso, la respuesta realmente depende de su gusto personal :)
Para obtener la lista completa de diferencias, consulte los enlaces javadoc proporcionados. ¡Feliz codificación!
fuente
Puede utilizar el siguiente código para sus necesidades
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
fuente
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); });
fuente
API de transmisión
public void iterateStreamAPI(Map<String, Integer> map) { map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue())); }
fuente
String ss = "Pawan kavita kiyansh Patidar Patidar"; StringBuilder ress = new StringBuilder(); Map<Character, Integer> fre = ss.chars().boxed() .collect(Collectors.toMap(k->Character.valueOf((char) k.intValue()),k->1,Integer::sum)); //fre.forEach((k, v) -> System.out.println((k + ":" + v))); fre.entrySet().forEach(e ->{ //System.out.println(e.getKey() + ":" + e.getValue()); //ress.append(String.valueOf(e.getKey())+e.getValue()); }); fre.forEach((k,v)->{ //System.out.println("Item : " + k + " Count : " + v); ress.append(String.valueOf(k)+String.valueOf(v)); }); System.out.println(ress.toString());
fuente