减少概念在番石榴库中实现?我的意思是我有多重映射:番石榴:如何自定义减少多图?
[1] -> 1, 2, 5, 8
[2] -> 3, 6, 4
[3] -> 1, 0
然后,我有一个倍增功能:
(a, b) -> a * b
而且我想要得到以下地图:
[1] -> 80 // 1 * 2 * 5 * 8
[2] -> 72 // 3 * 6 * 4
[3] -> 0 // 1 * 0
我该怎么办它在番石榴?
减少概念在番石榴库中实现?我的意思是我有多重映射:番石榴:如何自定义减少多图?
[1] -> 1, 2, 5, 8
[2] -> 3, 6, 4
[3] -> 1, 0
然后,我有一个倍增功能:
(a, b) -> a * b
而且我想要得到以下地图:
[1] -> 80 // 1 * 2 * 5 * 8
[2] -> 72 // 3 * 6 * 4
[3] -> 0 // 1 * 0
我该怎么办它在番石榴?
最简单的方法看起来像使用流entries()
以上的流,并映射功能,它将集合转换为流,并运行适当的reduce()
函数。
事情是这样的:
HashMap<Integer, Integer> collected =
mmap.entries().stream().collect(HashMap::new,
(map, e) -> {
map.put(e.getKey(), e.getValue().stream().reduce((a, b) -> (a * b)).get());
}, HashMap::putAll);
我不认为有番石榴减少操作。我想你有两个选择。
如果您使用的是java-8,只需在条目集上进行流式处理,然后将条目收集到一个新地图中,其中groupingBy
和reduce
即可。
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.reducing;
...
Map<Integer, Integer> map =
multimap.entries()
.stream()
.collect(groupingBy(Map.Entry::getKey,
reducing(1, Map.Entry::getValue, (a, b) -> a * b)));
groupingBy
,你可以猜测,会按他们的键值项。然后我们通过首先将它们映射到它们的值并最后乘以它们来减小分组的值(它们是Entry<Integer, Integer>
) - 为乘法提供1的标识值。
Multimap
拿回
Map<Integer, Collection<Integer>>
与
Multimaps.asMap
和使用
Maps.transformValues
:
Map<Integer, Collection<Integer>> tempMap = Multimaps.asMap(oldMap);
Map<Integer, Integer> newMap =
Maps.transformValues(tempMap, new Function<Collection<Integer>, Integer>() {
@Nullable
@Override
public Integer apply(Collection<Integer> input) {
//do the multiplication here
return 0;
}
});
使用String
键和List<Integer>
作为值。
您也可以尝试像
Map<String, List<Integer>> test = new HashMap<String, List<Integer>>();
test.put("a", Lists.newArrayList(1, 2, 3));
test.put("b", Lists.newArrayList(4, 5, 6));
Map<String, Integer> transformEntries = Maps.transformEntries(test, new EntryTransformer<String, List<Integer>, Integer>() {
@Override
public Integer transformEntry(String key, List<Integer> values) {
Integer a = 1;
for (Integer value : values) {
a = value * a;
}
return a;
}
});
System.out.println(transformEntries);
结果: {A = 6,B = 120}
这更像是我期待的。会试试看! –
**不幸的是,这段代码无效。请检查你自己。** –
@DenisKulagin更新了我的完整例如 –