我想做类似下面的事情,但我想知道是否有更优雅的方式来做这个没有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
));
答案 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>>
。外部收集器将每个中间映射合并为一个结果映射。
我承认这很难理解。 (这也需要花费一些力气。)如果将映射器提取到一个单独的方法中以便可以进行评论,那可能会更好。