Java 8 Stream API用于非规范化Map <a,set <b =“”>&gt;映射<b,a =“”>没有一对</b,> </a,>

时间:2014-07-16 18:17:01

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

我想做类似下面的事情,但我想知道是否有更优雅的方式来做这个没有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
    ));

1 个答案:

答案 0 :(得分: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);

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

我承认这很难理解。 (这也需要花费一些力气。)如果将映射器提取到一个单独的方法中以便可以进行评论,那可能会更好。