为了账号安全,请及时绑定邮箱和手机立即绑定

使用流将 Map<A, Map<B, C>> 转换为 Map<B, Map<A, C>>

使用流将 Map<A, Map<B, C>> 转换为 Map<B, Map<A, C>>

喵喔喔 2022-01-19 16:54:11
我有地图的结构图,例如:Map<Center, Map<Product, Value>> given我想得到Map<Product, Map<Center, Value>> result我用过 Java 流Map<Product, Map<Center, Value>> result = given.entrySet().stream()        .flatMap(entry -> entry.getValue()                 .entrySet().stream()                 .map(e -> Triple(entry.getKey(), e.getKey(), e.getValue())))        .collect(Collectors.groupingBy(Triple::getProduct,                    Collectors.toMap(Triple::getCenter, Triple::getValue)));Triple简单值类在哪里。我的问题是是否可以在不使用其他类Triple(如Table番石榴)的情况下实现它的功能?
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

没有流,有些事情会更容易完成:


Map<Product, Map<Center, Value>> result = new HashMap<>();

given.forEach((c, pv) -> pv.forEach((p, v) ->

        result.computeIfAbsent(p, k -> new HashMap<>()).put(c, v)));


查看完整回答
反对 回复 2022-01-19
?
DIEA

TA贡献1820条经验 获得超3个赞

不幸的是,如果您想继续使用流方法,则不可避免地要创建某种类型的中间对象Triple,即 ie 或AbstractMap.SimpleEntry任何其他适用的类型。


您实际上是在寻找类似 C# 的匿名类型的东西,即您可以映射到


new { k1 = entry.getKey(), k2 = e.getKey(), k3 = e.getValue()) }

然后立即访问groupingByandtoMap阶段的那些。


Java有类似但不完全的东西,你可以这样做:


Map<Product, Map<Center, Value>> result = 

           given.entrySet()

                .stream()

                .flatMap(entry -> entry.getValue()

                        .entrySet().stream()

                        .map(e -> new Object() {

                            Center c = entry.getKey();

                            Product p = e.getKey();

                            Value v = e.getValue();

                        }))

                .collect(Collectors.groupingBy(o -> o.p, Collectors.toMap(o -> o.c, o -> o.v))); 

归功于@shmosel。


唯一的好处是您不需要预定义自定义类。


查看完整回答
反对 回复 2022-01-19
  • 2 回答
  • 0 关注
  • 248 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号