【问题标题】:Java 8 Stream API to denormalize Map<A, Set<B>> to Map<B, A> without a PairJava 8 Stream API 将 Map<A, Set<B>> 非规范化为 Map<B, A> 而没有 Pair
【发布时间】:2014-07-16 18:17:00
【问题描述】:

我想做类似以下的事情,但我想知道是否有更优雅的方法可以在没有 Pair 类的情况下做到这一点。 Pair 类不再存在,所以我必须创建自己的类,这很好,但我只是好奇是否有办法避免它。

ordersByMerchant.entrySet().stream()
    .flatMap(merchantOrders -> {
          Merchant merchant = merchantOrders.getKey();
          Set<Order> orders = merchantOrders.getValue();
          return orders.stream()
              .map(order -> new Pair(order, merchant));
        }
    ).collect(toImmutableMap(
        Pair::getKey,
        Pair::getValue
    ));

【问题讨论】:

标签: java functional-programming java-8 java-stream


【解决方案1】:

假设Order 实例是唯一的,那么可以这样做:

Map<Merchant,Set<Order>> ordersByMerchant = ... ;

Map<Order,Merchant> result =
    ordersByMerchant.entrySet().stream()
        .map(entry -> entry.getValue().stream()
                      .collect(toMap(order -> order, x -> entry.getKey())))
        .collect(HashMap::new, Map::putAll, Map::putAll);

它通过将每个{Merchant, Set&lt;Order&gt;} 条目转换为中间Map&lt;Order,Merchant&gt; 来避免中间Pair 类。这导致Stream&lt;Map&lt;Order,Merchant&gt;&gt;。外部收集器将这些中间映射中的每一个合并为一个结果映射。

我承认这有点难以理解。 (写起来也费了点功夫。)如果将映射器提取到单独的方法中以便对其进行注释可能会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 2021-01-30
    • 2013-07-02
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多