0
点赞
收藏
分享

微信扫一扫

Java中快速对列表排序去重、排序

婉殇成长笔记 2022-03-12 阅读 309

一、集合泛型为基本包装类

初始物料数据

List<String> list = new ArrayList<>();
list.add("all");
list.add("dfg");
list.add("bnm");
list.add("cff");
list.add("uii");
list.add("uii");

1. 转Set

作用: 去重

System.out.println(list);
Set<String> set = new HashSet<>(list);
System.out.println(set);

结果:

[all, dfg, bnm, cff, uii, uii]
[all, bnm, cff, dfg, uii]


2. 转TreeSet

作用: 排序去重

System.out.println(list);
Set<String> tree = new TreeSet<>(list);
System.out.println(tree);

结果:

[all, dfg, bnm, cff, uii, uii]
[all, bnm, cff, dfg, uii]


3. Java8 stream

作用: 排序去重

System.out.println(list);
List<String> collect = list
           .stream() // 得到流
           .distinct() // 去重
           .sorted() // 自然排序
           .collect(Collectors.toList());//收集并返回
System.out.println(collect);

结果:

[all, dfg, bnm, cff, uii, uii]
[all, bnm, cff, dfg, uii]


二、集合泛型为POJO类

1. 根据对象中某一属性筛选去重

根据AddMonitorGetWbsVO对象中的wbsId属性去重

方法1:

public List<AddMonitorGetWbsVO> getWbsProject(AddMonitorGetWbsDTO dto) {
    List<AddMonitorGetWbsVO> monitorWbsProject = riskSourcesMapper.getMonitorWbsProject(dto);
    return monitorWbsProject.stream().collect(
            collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(AddMonitorGetWbsVO::getWbsId))), ArrayList::new));
}

方法2:

public List<AddMonitorGetWbsVO> getWbsProject(AddMonitorGetWbsDTO dto) {
    List<AddMonitorGetWbsVO> monitorWbsProject = riskSourcesMapper.getMonitorWbsProject(dto);
	return monitorWbsProject.stream()
		.filter(distinctByKey(AddMonitorGetWbsVO::getWbsId)).collect(Collectors.toList());
}


public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Map<Object,Boolean> seen = new ConcurrentHashMap<>();
    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
举报

相关推荐

0 条评论