2016-06-15 2 views
2

Java 8 позволяет итерации по Map с помощью forEach и лямбда-выражения следующим образом:Как перебрать MultivaluedMap с помощью Foreach и лямбда-выражения

myMap.forEach((k, v)->{ System.out.println("Key: " + k + " Value: " + v); }); 

Можно перебрать MultivaluedMap с помощью forEach и лямбда выражение?

UDPATE

Как вызвать foo с 2 String параметрами для MultivaluedMap<String, String>?

myMultiMap.forEach((k, v)->{ foo(k, v); }); 
+1

'myMultiMap.forEach ((K, L) -> l.forEach (V -> Foo (K, V)));' – Holger

ответ

4

Интерфейс MultivaluedMap<K, V> расширяет интерфейс Map<K,List<V>>, следовательно, существует метод forEach и что можно использовать его.

new MultivaluedHashMap<String, String>() 
     .forEach((String key, List<String> list)-> { ... }); 

Я не знаю, что делает ваш метод foo, но я предлагаю * учитывая мою точку зрения о том, что:

public <K, V> void foo(K key, V... values) { ... } 

В таком случае, вам не нужно писать внутренний forEach внутри лямбда.
* (это неправильно, как описано @Holder в комментариях)

Таким образом, есть только один правильный способ:

map.forEach((k, l) -> l.forEach(v -> foo(k, v))); 
+1

@ksl, да, да, кроме того, у него есть несколько удобных методов для работы (например, 'addAll (K key, V ... newValues)', 'getFirst (K key)') – Andrew

+1

Я бы хотел см. полное решение для вызова метода 'foo' с varargs из мульти-карты. Учитывая стандартный API Java 8 Collection API, вам нужно будет преобразовать список в массив для каждого сопоставления. Возможно, есть еще один трюк, который я пропустил до сих пор ... – Holger

+1

@Holger, https://gist.github.com/andrewtobilko/bba3e43fa60a69a11642f12425fb004a – Andrew

0

Благодаря Andrew Tobilko's answer я был в состоянии понять, что именно я хотеть.

Это может быть сделано в одной строке следующим образом:

myMultiMap.forEach((k, v)->{ v.forEach(item-> foo(k, item)); }); 
+0

вы можете избежать внутреннего 'forEach' в лямбда, посмотрите на мой ответ) – Andrew

+0

Я не могу изменить' foo' в моем приложении. Требуется два 'String'. – ksl