Как напечатать несколько параметров, используя ссылку на метод в java8 - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь распечатать базовый hashmap с двумя в Java.

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

Но я не могу понять, как напечатать несколько параметров, когда дело доходит до method reference в java8.

Я попробовал что-то подобное. Но это дает мне ошибки компиляции.

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

Пожалуйста, помогите мне разобраться в этом. Спасибо.

Ответы [ 5 ]

0 голосов
/ 10 сентября 2018

Вы также можете распечатать с помощью entrySet

 mp.entrySet().forEach(e->System.out.println(e.getKey()+"="+e.getValue()));
0 голосов
/ 08 сентября 2018

Может противоречить другим ответам, но я действительно не вижу необходимости в том, чтобы вы использовали здесь ссылку на метод. ИМХО,

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

намного лучше, чем ссылка на метод для такого варианта использования.

0 голосов
/ 08 сентября 2018

Вы не можете. Язык не допускает этого, там не существует неявных i и s, которые можно было бы таким образом передать в ссылку на метод. Что ты можешь сделать, не знаю почему, но ты мог бы:

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

И используйте его с:

map.forEach(Yourclass::consumeBoth)

Но это можно сделать с помощью лямбда-выражения, я действительно не вижу пользы для этого небольшого примера

0 голосов
/ 08 сентября 2018

Вы не можете указать пробел, используя ссылку на метод System.out::println.
Аргумент, переданный System.out::println, определяется параметром BiConsumer Map.forEach(BiConsumer).

Но вы можете отформатировать ожидаемое String с помощью map(), таким образом, аргумент, выведенный в System.out::println, будет форматированной строкой, что вам нужно:

mp.entrySet()
  .stream()
  .map(e-> e.getKey() + " " + e.getValue())
  .forEach(System.out::println);
0 голосов
/ 08 сентября 2018

Вы можете написать отдельный метод, например:

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

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

Или, если Map.Entry<K, V>.toString() соответствует вашим требованиям:

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

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

Редактировать: Кроме того, следуя совету @ Хольгера, вы можете спокойно опускать параметры типа, пока код внутри метода не зависит от них:

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

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