java 8流动api以将map<A, Set<B>>map<B, A>>map

问题描述 投票:0回答:2

我想做以下操作,但是我想知道是否有一种更优雅的方法可以在没有这对课程的情况下进行。这对班级不再存在,所以我必须创建自己的班级,这很好,但是我很好奇是否可以避免它。
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
2个回答
3
投票

废话

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

IT通过将每个

Pair
输入转换为中间
{Merchant, Set<Order>}
来避免中间
Map<Order,Merchant>
类。这导致了一个。外部收集器将这些中间图中的每一个合并为单个结果映射。 我承认这很难遵循。 (也花了一点努力写作。)如果将映射器提取为单独的方法,以便可以评论它可能会更好。

Stream<Map<Order,Merchant>>

0
投票
类功能很像一对,可以使用它的实例:

Map.Entry

    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.