【Java】【48】List去重
前言: 1,for循环去重 2,hashSet去重 3,Stream去重 正文: //取ID不重复的数据 public class User { private Integer id; private String name; } List<User> users = Lists.newArrayList( new User(1,"a"),new User(1,"b"),new User(2,"a")); 1,for循环去重 public void dis1() { List<User> result = new LinkedList<>(); for (User user : users) { boolean b = result.stream().anyMatch(u -> u.getId().equals(user.getId())); if (!b) { result.add(user); } } System.out.println(result); } 2,hashSet去重 public void dis2() { Set<User> result = new HashSet<>(users); System.out.println(result); } 重写hashcode和equals方法 //user类中 @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } User user = (User) o; return Objects.equals(id,user.id); } @Override public int hashCode() { return Objects.hash(id); } //Objects.hash()这个方法的源码中 //result = 31 * result + (element == null ? 0 : element.hashCode()); 3,Stream去重 public void dis3() { users.parallelStream().filter(distinctByKey(User::getId)) .forEach(System.out::println); } public static <T> Predicate<T> distinctByKey(Function<? super T,?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); } Stream有distinct方法,但是没有提供自定义条件,要自定义条件,需要重写hashcode和equals方法,否则可以直接使用 users.parallelStream().distinct().forEach(System.out::println); 参考博客: Java中对List去重,Stream去重 - Ryan.Miao - 博客园 HashSet的去重问题 - qq_28385797的博客 - CSDN博客 如何正确的重写equals() 和 hashCode()方法 - Zone - CSDN博客 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |