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;
}
}