Java 8流API用于反规范化映射<;A、 设置<;B>&燃气轮机;映射<;B、 A>;没有一双
我想做如下的事情,但是我想知道是否有一种更优雅的方法可以在没有Pair类的情况下完成。结对类不再存在,所以我必须创建自己的类,这很好,但我只是好奇是否有办法避免它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
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,然后调用它。