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