Java流:收集映射以为每个流元素创建两个键

时间:2020-11-12 09:39:17

标签: java java-stream

我有一个调用.collect(Collectors.toMap)的Java流。 Collectors.toMap接受keyMappervalueMapper函数。我想为每个流元素创建两个条目,使用两个不同的keyMapper函数,但是使用相同的valueMapper函数。可以在不创建自定义收集器的情况下以一种不错的流语法来做到这一点吗?

当然,我还可以获取一个映射,然后在流链调用之外向其添加另一组具有相同值的键。但是我想知道它是否可以变得更整洁……

基本上我拥有的是

List<A> someObjects = ...; // obtain somehow
Map<String, B> res = someObjects.stream().collect(Collectors.toMap(keyMapper1, valueMapper));

函数keyMapper1keyMapper2产生不同的字符串,我希望映射中的两个字符串都具有相同的值。

我能做的是:

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);
});

但是也许可以在不创建中间变量的情况下完成某些工作吗?

1 个答案:

答案 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));