Java Stream将List<Object>转为Map<Object,Object>

1、准备需要转化的集合数据

@Data
public class RegionBean {

    private  Integer  id;
    private Integer parentId;
    private String  name;

    public static List<RegionBean>  initList(){
        List<RegionBean> list = new ArrayList<>();
        list.add(new RegionBean(1,-1,"河南"));
        list.add(new RegionBean(11,1,"郑州"));
        list.add(new RegionBean(12,1,"洛阳"));
        list.add(new RegionBean(13,1,"信阳"));
        list.add(new RegionBean(14,1,"新乡"));

        list.add(new RegionBean(2,-1,"广东"));
        list.add(new RegionBean(21,2,"广州"));
        list.add(new RegionBean(22,2,"深圳"));
        list.add(new RegionBean(23,2,"佛山"));
        list.add(new RegionBean(24,2,"东莞"));

        list.add(new RegionBean(3,-1,"江苏"));
        list.add(new RegionBean(31,3,"南京"));
        list.add(new RegionBean(32,3,"苏州"));
        list.add(new RegionBean(33,3,"无锡"));
        list.add(new RegionBean(34,3,"常州"));
        return  list;
    }
}

2、将List<RegionBean >转成Map<Integer,RegionBean >,把parentId相同的地区放到一个List集合中去:

 List<RegionBean> regionBeans = RegionBean.initList();
 Map<Integer, List<RegionBean>> map = regionBeans.stream().
                              collect(Collectors.groupingBy(RegionBean::getParentId,
                              Collectors.mapping(regionBean -> regionBean, 
                              Collectors.toList())));

3、将LIst<RegionBean>转成Map<Integer,RegionBean>,以为id为key

List<RegionBean> regionBeans = RegionBean.initList();
Map<Integer, Object> map2 =regionBeans.stream().
                          collect(Collectors.toMap(RegionBean::getId,
                           regionBean -> regionBean));

4、多维度排序

    根据名称和id排序

List<RegionBean> regionBeans = RegionBean.initList(); 
List<RegionBean> sortList = regionBeans.parallelStream().
sorted(Comparator.comparing(RegionBean::getName).thenComparing(RegionBean::getId)).
collect(Collectors.toList());
System.out.printf("sortList---"+sortList);

5、去重

public class StreamUtils {

    /**
     * 去掉重复数据
     *
     * @param keyExtractor
     * @param <T>
     * @return
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>(16);
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

    /**
     * 只获取重复的数据
     * @param keyExtractor
     * @param <T>
     * @return
     */
    public static <T> Predicate<T> distinctNotByKey(Function<? super T, ?> keyExtractor){
        Map<Object, Boolean> seen = new ConcurrentHashMap<>(16);
        return t ->seen.putIfAbsent(keyExtractor.apply(t),Boolean.TRUE)!=null;
     }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值