Java8 — 常用的集合转换与排序

为了方便演示创建了一个购物车商品类

@Data
public class ShoppingCartItem {
    /**
     * ID
     */
    private Long id;

    /**
     * 卖家ID
     */
    private Long sellerId;

    /**
     * 创建购物车商品时间
     */
    private Date createdAt;

    /**
     * 修改购物车商品时间
     */
    private Date updatedAt;
}

1.List 转 Map

很常见的场景就是从数据库按条件取出 List,但是因为业务需要需要维护List中相应的映射关系。比如我们需要按卖家 ID 为 Key 建立映射关系。

Map map = list.stream().collect(Collectors.toMap(e -> e.getBuyerId(), Function.identity()));

当Key重复时进行处理,当然可以定制 Function 去做相应的处理。

Map map = list.stream().collect(Collectors.toMap(e -> e.getSellerId(), Function.identity(), (e1, e2) -> e1));

2.List 转 Map

很显然上面的处理并不够好,我们总不能让一个商家只能显示一个商品吧,所以我们要把商家对应的商品聚合起来。

Map> collect = list.stream().collect(Collectors.groupingBy(e -> e.getSellerId()));

3.Map 转 List

// 将Map的Keys转换为List
List list1 = new ArrayList<>(map.keySet());
// 将Map的Values转换为List
List list2 = new ArrayList<>(map.values());
// stream 的方式,效率上低于直接构造方法的方式,应该是ArrayList的扩容机制影响的效率
List list3 = map.keySet().stream().collect(Collectors.toList());

4.对更新时间进行排序,并按卖家ID分组

很实际的一个功能,京东的购物车也是这样的

Map> collect = list.stream()
                .sorted(Comparator.comparingLong((ShoppingCartItem c) -> c.getUpdatedAt().getTime()).reversed())
                .collect(Collectors.groupingBy(ShoppingCartItem::getSellerId));

你可能感兴趣的:(Java8 — 常用的集合转换与排序)