为了方便演示创建了一个购物车商品类
@Data
public class ShoppingCartItem {
/**
* ID
*/
private Long id;
/**
* 卖家ID
*/
private Long sellerId;
/**
* 创建购物车商品时间
*/
private Date createdAt;
/**
* 修改购物车商品时间
*/
private Date updatedAt;
}
1.List<ShoppingCartItem> 转 Map<Long, ShoppingCartItem>
很常见的场景就是从数据库按条件取出 List,但是因为业务需要需要维护List中相应的映射关系。比如我们需要按卖家 ID 为 Key 建立映射关系。
Map<Long, ShoppingCartItem> map = list.stream().collect(Collectors.toMap(e -> e.getBuyerId(), Function.identity()));
当Key重复时进行处理,当然可以定制 Function 去做相应的处理。
Map<Long, ShoppingCartItem> map = list.stream().collect(Collectors.toMap(e -> e.getSellerId(), Function.identity(), (e1, e2) -> e1));
2.List<ShoppingCartItem> 转 Map<Long, ShoppingCartItem>
很显然上面的处理并不够好,我们总不能让一个商家只能显示一个商品吧,所以我们要把商家对应的商品聚合起来。
Map<Long, List<ShoppingCartItem>> collect = list.stream().collect(Collectors.groupingBy(e -> e.getSellerId()));
3.Map<Long, ShoppingCartItem> 转 List
// 将Map的Keys转换为List
List<Long> list1 = new ArrayList<>(map.keySet());
// 将Map的Values转换为List
List<ShoppingCartItem> list2 = new ArrayList<>(map.values());
// stream 的方式,效率上低于直接构造方法的方式,应该是ArrayList的扩容机制影响的效率
List<Long> list3 = map.keySet().stream().collect(Collectors.toList());
4.对更新时间进行排序,并按卖家ID分组
很实际的一个功能,京东的购物车也是这样的
Map<Long, List<ShoppingCartItem>> collect = list.stream()
.sorted(Comparator.comparingLong((ShoppingCartItem c) -> c.getUpdatedAt().getTime()).reversed())
.collect(Collectors.groupingBy(ShoppingCartItem::getSellerId));