繁体   English   中英

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

[英]Java streams: collect to map creating two keys for each stream element

我有一个调用.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));

并且函数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);
});

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

您可以使用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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM