前言:
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, "b"), new User(1, "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 - 博客园
https://www.cnblogs.com/woshimrf/p/java-list-distinct.html
HashSet的去重问题 - qq_28385797的博客 - 优快云博客
https://blog.youkuaiyun.com/qq_28385797/article/details/72834970
如何正确的重写equals() 和 hashCode()方法 - Zone - 优快云博客
https://blog.youkuaiyun.com/zzg1229059735/article/details/51498310
本文详细介绍了在Java中对List进行去重的三种常见方法:for循环去重、使用HashSet去重以及利用Stream API去重。通过具体的代码示例,展示了如何针对含有重复ID的User对象列表进行有效去重,并探讨了在使用HashSet和Stream去重时,重写equals和hashCode方法的重要性。
1380

被折叠的 条评论
为什么被折叠?



