【问题标题】:How to iterate over MultivaluedMap using forEach and a lambda expression如何使用 forEach 和 lambda 表达式迭代 MultivaluedMap
【发布时间】:2016-10-16 09:01:51
【问题描述】:

Java 8 允许使用 forEach 和 lambda 表达式对 Map 进行迭代,如下所示:

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

是否可以使用 forEach 和 lambda 表达式迭代 MultivaluedMap

UDPATE

如何使用 2 个 String 参数调用 foo 以获取 MultivaluedMap<String, String>

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

【问题讨论】:

  • myMultiMap.forEach((k, l) -> l.forEach( v -> foo(k, v)));

标签: java foreach lambda java-8


【解决方案1】:

接口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) { ... }

在这种情况下,您无需在 lambda 中写入内部 forEach
*(这是错误的,正如 cmets 中的 @Holder 所解释的那样)

所以,只有一种正确的方法:

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

【讨论】:

  • @ksl,是的,它有,而且,它有几个方便的方法可以使用(例如addAll(K key, V... newValues)getFirst(K key)
  • 我希望看到使用多映射中的可变参数调用foo 方法的完整解决方案。考虑到标准的 Java 8 Collection API,您必须将列表转换为每个映射的数组。也许到目前为止我还错过了另一个技巧……
  • 如果您想知道输出中的双 [[ … ]]:这看起来只是在做正确的事情,因为 foo 上的无意义类型参数 &lt;K, V&gt;。所以V 被推断为List&lt;String&gt; 并且每个列表都作为可变参数参数的第一个参数传递,您打印它就像被包装到另一个列表中一样。当foo 不是可变参数方法时,你甚至可以调用它,只要V 可以是调用者提供的任何东西。但是OP想要调用一个处理Strings的方法……
【解决方案2】:

感谢Andrew Tobilko's answer 我能够准确地弄清楚我想要什么。

可以在一行中完成,如下所示:

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

【讨论】:

  • 你可以避免lambda中的内部forEach,看看我的回答)
  • 我无法在我的应用程序中更改foo。它需要两个Strings。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多