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

Java streams:收集以映射为每个流元素创建两个键,java,java-stream,Java,Java Stream,我有一个调用.collect(Collectors.toMap)的Java流收集器。toMap接受keyMapper和valueMapper函数。我想为每个流元素创建两个条目,使用两个不同的keyMapper函数,但使用相同的valueMapper函数。在不创建自定义收集器的情况下,是否可以使用漂亮的流语法来执行此操作 当然,我也可以得到一个映射,然后在流链调用之外添加另一组具有相同值的键。但我想知道它是否能变得更整洁 基本上我所拥有的是: List<A> someObjects =

我有一个调用
.collect(Collectors.toMap)
的Java流<代码>收集器。toMap接受
keyMapper
valueMapper
函数。我想为每个流元素创建两个条目,使用两个不同的
keyMapper
函数,但使用相同的
valueMapper
函数。在不创建自定义收集器的情况下,是否可以使用漂亮的流语法来执行此操作

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

基本上我所拥有的是:

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

但是也许不需要创建中间变量就可以完成一些事情?

您可以使用
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));
Map Map=someObjects.stream()
.flatMap(obj->Stream.of(
映射条目(keyMapper1(obj)、valueMapper(obj)),
Map.entry(keyMapper2(obj)、valueMapper(obj)))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

您可以使用
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));
Map Map=someObjects.stream()
.flatMap(obj->Stream.of(
映射条目(keyMapper1(obj)、valueMapper(obj)),
Map.entry(keyMapper2(obj)、valueMapper(obj)))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

拥有
forEach
之前,您可以调用
map
并返回具有定义键(通过映射器)和相同值(值映射器)的2个元素(对)的列表;拥有
forEach
之前,您可以调用
map
并返回具有定义键(通过映射器)和相同值(值映射器)的2个元素(对)的列表自Java9:
Map.entry(…)
。自Java9:
Map.entry(…)