我有一个调用.collect(Collectors.toMap)
的Java流。 Collectors.toMap
接受keyMapper
和valueMapper
函数。我想为每个流元素创建两个条目,使用两个不同的keyMapper
函数,但是使用相同的valueMapper
函数。可以在不创建自定义收集器的情况下以一种不错的流语法来做到这一点吗?
当然,我还可以获取一个映射,然后在流链调用之外向其添加另一组具有相同值的键。但是我想知道它是否可以变得更整洁……
基本上我拥有的是
List<A> someObjects = ...; // obtain somehow
Map<String, B> res = someObjects.stream().collect(Collectors.toMap(keyMapper1, valueMapper));
函数keyMapper1
和keyMapper2
产生不同的字符串,我希望映射中的两个字符串都具有相同的值。
我能做的是:
Map<A, B> map = someObjects.stream().collect(Collectors.toMap(Function.identity(), valueMapper));
Map<String, B> result = new HashMap<>();
map.forEach((a, b) -> {
result.put(keyMapper1(a), b);
result.put(keyMapper2(a), b);
});
但是也许可以在不创建中间变量的情况下完成某些工作吗?
答案 0 :(得分:2)
您可以使用flatMap
首先创建所有地图条目的流,然后将它们收集到地图中。像这样:
Map<String, String> map = someObjects.stream()
.flatMap(obj -> Stream.of(
Map.entry(keyMapper1(obj), valueMapper(obj)),
Map.entry(keyMapper2(obj), valueMapper(obj))))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));