Java 8流API用于反规范化映射<;A、 设置<;B>&燃气轮机;映射<;B、 A>;没有一双

Java 8流API用于反规范化映射<;A、 设置<;B>&燃气轮机;映射<;B、 A>;没有一双,java,functional-programming,java-8,java-stream,Java,Functional Programming,Java 8,Java Stream,我想做如下的事情,但是我想知道是否有一种更优雅的方法可以在没有Pair类的情况下完成。结对类不再存在,所以我必须创建自己的类,这很好,但我只是好奇是否有办法避免它 ordersByMerchant.entrySet().stream() .flatMap(merchantOrders -> { Merchant merchant = merchantOrders.getKey(); Set<Order> orders = merc

我想做如下的事情,但是我想知道是否有一种更优雅的方法可以在没有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
    ));
ordersByMerchant.entrySet().stream()
.flatMap(销售商->{
Merchant=merchantOrders.getKey();
设置订单=merchantOrders.getValue();
returnorders.stream()
.map(订单->新对(订单、商户));
}
).收集(toImmutableMap)(
Pair::getKey,
Pair::getValue
));

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

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);
Map ordersByMerchant=;
映射结果=
ordersByMerchant.entrySet().stream()
.map(entry->entry.getValue().stream())
.collect(toMap(order->order,x->entry.getKey())
.collect(HashMap::new,Map::putAll,Map::putAll);
它通过将每个
{Merchant,Set}
条目转换为中间
映射
来避免中间
类。这将导致
。外部收集器将每个中间映射合并到单个结果映射中


我承认这很难理解。(写起来也需要一些努力。)如果将映射器提取到一个单独的方法中,以便对其进行注释,可能会更好。

您可以填充Guava Multiset,然后调用它。