我正在努力使用Vavr将Map
s的List
减少到单个Map
<List<Map<String, Object>>>
<Map<String, Object>>
我尝试了flatmap
/reduce
/merge
,但不幸的是没有快乐的结局:-(
有人能提供一个例子,如何做它与io.vavr.collection.List
/io.vavr.collection.Map
?
你有几个选择。
例如,给定以下数据集(很抱歉过于简单):
Map<String, Object> map1 = HashMap.of("key1", "value1", "key2", "value2");
Map<String, Object> map2 = HashMap.of("key3", "value3", "key4", "value4");
Map<String, Object> map3 = HashMap.of("key5", "value5", "key6", "value6");
List<Map<String, Object>> list = List.of(map1, map2, map3);
您可以将不同的Map
与fold
组合,例如:
Map<String, Object> result = list.fold(HashMap.empty(), (m1, m2) -> m1.merge(m2));
您也可以使用reduce
:
Map<String, Object> result = list.reduce((m1, m2) -> m1.merge(m2));
它们都使用Map
merge
方法。这个方法有一个重载版本,它允许你定义如何解决冲突。
我不知道vavr与此有什么关系。
list.stream() // A
.flatMap(map -> map.entrySet().stream()) // B
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
[A]现在你有一个Map<String, Object>
流。
[B]现在你有一个映射条目流。现在你有了一个键/值对流。
然后通过提供从Map.Entry
对象中提取键的函数和提取值的函数将它们收集到一个映射中。
注意,如果你有一个类型为Map<String, Object>
的映射,我给它99%的可能性你做错了什么。毕竟,Java在名义上是静态强类型的。