Estoy tratando de imprimir básico hashmap con twoin java.

Map<Integer, String> mp = new HashMap<Integer, String>();
mp.put(10, "apple");
mp.put(20, "orange");
mp.put(30, "banana");

Pero no puedo entender cómo imprimir múltiples parámetros, cuando se trata de method reference en java8.

Intenté algo como esto. Pero me está dando errores de compilación.

mp.forEach(System.out::println(i+" "+s););

Por favor, ayúdame a resolver esto. Gracias.

7
Search Results Web results Pi 8 sep. 2018 a las 16:41

5 respuestas

La mejor respuesta

Puede escribir un método separado, por ejemplo:

public static <K, V> void printEntry(Map.Entry<K, V> e) {
    System.out.println(e.getKey() + " " + e.getValue());
}

map.entrySet().forEach(Demo::printEntry);

O, si Map.Entry<K, V>.toString() cumple con sus requisitos:

map.entrySet().forEach(System.out::println);

// 20=orange
// 10=apple
// 30=banana

Editar: Además, siguiendo los consejos de @ Holger, puede omitir con seguridad los parámetros de tipo siempre que el código dentro del método no dependa de ellos:

public static void printEntry(Object k, Object v) {
    System.out.println(k + " " + v);
}

map.forEach(Demo::printEntry);
5
Oleksandr Pyrohov 17 sep. 2018 a las 08:42

No puede especificar el espacio en blanco utilizando la referencia de método System.out::println.
El argumento pasado a System.out::println se infiere mediante el parámetro BiConsumer de Map.forEach(BiConsumer).

Pero puede formatear el String esperado con map(), de esta manera, el argumento inferido en System.out::println sería la cadena formateada, lo que necesita:

mp.entrySet()
  .stream()
  .map(e-> e.getKey() + " " + e.getValue())
  .forEach(System.out::println);
4
davidxxx 8 sep. 2018 a las 13:58

Puede ser contradictorio con otras respuestas, pero realmente no veo la necesidad de que uses una referencia de método aquí. EN MI HUMILDE OPINIÓN,

mp.forEach((i, s) -> System.out.println(i + " " + s));

Es mucho mejor que la referencia de método para tal caso de uso.

8
Naman 8 sep. 2018 a las 17:19

No puedes El lenguaje no permite eso, no hay i y s implícitos que puedan pasarse a una referencia de método de esa manera. Lo que puedes hacer, no sé por qué, pero podrías:

private static <K, V> void consumeBoth(K k, V v) {
     //Log how u want this
}

Y úsalo con:

map.forEach(Yourclass::consumeBoth)

Pero esto se puede hacer en el lugar con una expresión lambda, realmente no veo ningún beneficio para este pequeño ejemplo

6
Eugene 8 sep. 2018 a las 13:55

También puede imprimir usando entrySet

 mp.entrySet().forEach(e->System.out.println(e.getKey()+"="+e.getValue()));
1
ravthiru 10 sep. 2018 a las 08:12